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?) { … } … }