絶賛個人開発中のアプリで Clean Architecture
を採用していて、DI(Dependency Injection)
Framework の Koin
を使う機会があったので、その使用方法をメモ程度に残しておきたいと思います🏃🏻♂️
それではやっていく
まずは、App
レベルの build.gradle
の dependencies
に下記を追加します。この記事執筆時点では、バージョン 2.2.2
が安定版でした。
implementation "org.koin:koin-android:2.2.2"
次にカスタムの Application
クラスを作成し、onCreate
メソッドの中で Koin
を初期化します。今回の場合は、Repository
・UseCase
・Presenter
の三層に分けて使用するクラスを Interface
としてセットしています。ちなみに依存関係は、Repository <- UseCase <- Presenter
のようになり、UseCase
は RepositoryInterface
が Presenter
は UseCaseInterface
がそれぞれコンストラクタに必要となります。そして、それぞれの依存関係の注入は Koin
の get()
メソッドを使うことで自動的に行われます。下記のコードを例にすると RealmRepositoryInterface
が必要な OnboardSignUpUseCase
は get()
メソッドを使用することで依存関係が注入されています。
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)) } } }
そして Activity
や Fragment
、Service
などで使用する時は inject()
メソッドを使ってインスタンスを取得することができます(楽ですね〜✨)。
private val presenter: OnboardSignUpSelectAccountTypeFragmentPresenterInterface by inject()
という感じで本日も以上になります🍺