iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【Kotlin】Koin で DI してみた

絶賛個人開発中のアプリで Clean Architecture を採用していて、DI(Dependency Injection) Framework の Koin を使う機会があったので、その使用方法をメモ程度に残しておきたいと思います🏃🏻‍♂️

github.com

それではやっていく

まずは、App レベルの build.gradledependencies に下記を追加します。この記事執筆時点では、バージョン 2.2.2 が安定版でした。

    implementation "org.koin:koin-android:2.2.2"

次にカスタムの Application クラスを作成し、onCreate メソッドの中で Koin を初期化します。今回の場合は、RepositoryUseCasePresenter の三層に分けて使用するクラスを Interface としてセットしています。ちなみに依存関係は、Repository <- UseCase <- Presenter のようになり、UseCaseRepositoryInterfacePresenterUseCaseInterface がそれぞれコンストラクタに必要となります。そして、それぞれの依存関係の注入は Koinget() メソッドを使うことで自動的に行われます。下記のコードを例にすると RealmRepositoryInterface が必要な OnboardSignUpUseCaseget() メソッドを使用することで依存関係が注入されています。

class MainApplication : Application() {

    override fun onCreate() {
        super.onCreate()
        setupKoin()
    }

    private fun setupKoin() {
        val repositoryModule: Module = module {
            factory { RealmRepository() as RealmRepositoryInterface }
        }
        val useCaseModule: Module = module {
            factory { OnboardSignUpUseCase(get()) as OnboardSignUpUseCaseInterface }
        }
        val presenterModule: Module = module {
            factory { OnboardSignUpSelectAccountTypeFragmentPresenter(get()) as OnboardSignUpSelectAccountTypeFragmentPresenterInterface }
        }
        startKoin {
            androidContext(this@MainApplication)
            modules(listOf(repositoryModule, useCaseModule, presenterModule))
        }
    }
}

そして ActivityFragmentService などで使用する時は inject() メソッドを使ってインスタンスを取得することができます(楽ですね〜✨)。

    private val presenter: OnboardSignUpSelectAccountTypeFragmentPresenterInterface by inject()

という感じで本日も以上になります🍺

参考

start.insert-koin.io

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com