Koinでインスタンス生成時にActivityをinjectする方法

Koinを使ったをDI行った際に、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?) {
        …
    }
    
    …
}

参考

https://beta.insert-koin.io/docs/1.0/documentation/koin-core/index.html#_defining_an_injection_parameter