【问题标题】:org.kodein.di.Kodein$NotFoundException: 2 bindings found that match bind()org.kodein.di.Kodein$NotFoundException:发现 2 个与 bind() 匹配的绑定
【发布时间】:2019-12-22 09:57:58
【问题描述】:

我有一个接口WordsDataSource 使用它实现了两个具体的类,即处理本地数据库的WordsLocalDataSource 和另一个处理服务器上在线处理数据的WordsRemoteDataSource。问题是当我尝试使用抽象类名WordsDataSource 将两个类注入存储库类时

DefaultWordsRepository(
     private val wordsRemoteDataSource: WordsDataSource,
     private val wordsLocalDataSource: WordsDataSource) {

并在 Application 类中添加依赖项,例如

class WordsApplication : Application(), KodeinAware {

    override val kodein = Kodein.lazy {
        import(androidXModule(this@WordsApplication))
        bind() from singleton { WordsDatabase.getInstance(instance()) }
        bind<WordsDao>() with singleton { instance<WordsDatabase>().wordsDao() }
        bind() from singleton { WordsLocalDataSource(instance()) }
        bind() from singleton { WordsRemoteDataSource() }
        bind<WordsRepository>() with singleton { DefaultWordsRepository(instance(), instance()) }
        bind() from provider { ViewModelFactory(instance()) }
    }

然后在运行应用程序时,我在 logcat 中遇到以下问题

org.kodein.di.Kodein$NotFoundException: 2 bindings found that match bind<WordsDataSource>() with ?<WordsFragment>().? { ? }:
        bind<WordsLocalDataSource>() with singleton { WordsLocalDataSource }
        bind<WordsRemoteDataSource>() with singleton { WordsRemoteDataSource }

我已经尝试了解决此问题的方法,只需通过变量各自的具体类名来声明变量,例如

DefaultWordsRepository(
     private val wordsRemoteDataSource: WordsRemoteDataSource,
     private val wordsLocalDataSource: WordsLocalDataSource) {

但还是想知道有没有办法解决这个问题。

我正在为 kodein 使用以下依赖项

implementation "org.kodein.di:kodein-di-generic-jvm:6.3.3"
implementation "org.kodein.di:kodein-di-framework-android-x:6.3.3"

【问题讨论】:

    标签: android kotlin dependency-injection kodein


    【解决方案1】:

    通过编写显式类型,您已经做到了正确的方式:

    DefaultWordsRepository(
         private val wordsRemoteDataSource: WordsRemoteDataSource,
         private val wordsLocalDataSource: WordsLocalDataSource)
    

    在使用子类型时,我们不知道选择哪种实现方式。写作

    DefaultWordsRepository(
         private val wordsRemoteDataSource: WordsDataSource,
         private val wordsLocalDataSource: WordsDataSource)
    

    如果您想要两个子类型或两倍于WordsRemoteDataSourceWordsLocalDataSource,则无法找到。因此,您需要明确定义您的类型。甚至,我们可以将WordsRemoteDataSource 放在属性wordsLocalDataSource 中,因为我们不能依赖变量名。

    【讨论】:

    • 好的,我明白了。谢谢,@romainbsl。我也会这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 2021-07-24
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多