web-dev-qa-db-ja.com

複数のモジュールでKoinを使用する方法

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モジュールをマージしてからstartKoinMyApplicationで呼び出すことですが、私はそれが好きではありません。 Libモジュールは他のAndroidプロジェクトによってインポートされる可能性があります。その場合、startKoinInitKoinContentProviderで呼び出す方が良いと思います。

この問題の解決策はありますか?ありがとう!

6
aiueoH

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() }
})
_
0
Andrii Panasiuk