My Androidプロジェクト、アプリモジュール、およびlibモジュールの2つのモジュールがあります。
これらの2つのモジュールはどちらもD.I.用のKoinを必要とするため、以下のように、アプリモジュールのstartKoin
クラスのMyApplication
とlibモジュールのIninKointContentProvider
を呼び出します。
// app module
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin(this, modules1)
}
}
// lib module
class InitKoinContentProvider : ContentProvider() {
override fun onCreate(): Boolean {
startKoin(context.applicationContext, modules2)
return true
}
}
次に、アプリがクラッシュしてこのメッセージが表示されました
Caused by: org.koin.error.BeanOverrideException: Try to override definition with Single [class='Android.content.Context'], but override is not allowed. Use 'override' option in your definition or module.
startKoin
は一度しか呼び出せないと思います。
私が見つけた解決策は、2つのKoinモジュールをマージしてからstartKoin
をMyApplication
で呼び出すことですが、私はそれが好きではありません。 Libモジュールは他のAndroidプロジェクトによってインポートされる可能性があります。その場合、startKoin
をInitKoinContentProvider
で呼び出す方が良いと思います。
この問題の解決策はありますか?ありがとう!
TL; DR以前に読み込まれたモジュールによって提供される依存関係をオーバーライドする依存関係を提供するときは、override
paramをtrue
に設定して_single/factory
_メソッドを使用します。
_single<Manager>(override = true) { TestManager() }
_
UIテストの目的で依存関係の1つをオーバーライドしようとしたときに、同様の問題に直面しました。 Application.onCreate()
でセットアップすると:
_startKoin {
module {
single { Printer() }
}
}
_
テストのbefore
メソッドで:
_loadKoinModules(module {
single<Printer> { TestPrinter() }
})
_
テスト中にランタイム例外が発生します:_org.koin.core.error.DefinitionOverrideException: Already existing definition or try to override an existing one
_
そして解決策は、あなたが意図的にを使用してその依存関係を上書きしていることをKoinに示すことですoverride
そのようなsingle
関数のパラメーター:
_loadKoinModules(module {
single<Printer>(override = true) { TestPrinter() }
})
_