Koinを使ったをDI行った際にDagger AndroidのAndroidInjector
を使った場合のように、Activity/Fragment側でinjectしたクラス(Presenterなど)に対してActivity/Fragmentのインスタンスをコンストラクタインジェクションする方法が分からなかったので調べました。
対象となるクラスの定義
今回のサンプルとしてコンストラクタパラメータとしてActivityおよびUseCaseを必要とするPresenterを定義します。
(UseCaseクラスのインスタンス生成に関しては別途モジュール定義がされているものとします)
class LoginPresenter(private val activity: Activity, private val loginUseCase: LoginUseCase) {
}
##モジュールの定義
上記のLoginPresenter
を生成するためのモジュール定義は以下のようになります。
通常のモジュール定義と異なり、LoginUseCase
に関してはget()
を用いたKoinによるインスタンス生成を行いますが、Activity
に関してはfactoryブロックのパラメータとして定義します。
val presenterModule = module {
factory { (activity: Activity) -> LoginPresenter(activity, get()) }
}
##Activity側の実装
次のようにInjectする際にパラメータとしてfactoryブロックのパラメータとして定義したActivity
のインスタンス(this)を指定する事が可能です。
class LoginActivity : AppCompatActivity() {
private val loginPresenter: LoginPresenter by inject { parametersOf(this) }
override fun onCreate(savedInstanceState: Bundle?) {
}
}