首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >org.kodein.di.Kodein$NotFoundException:发现2个绑定与bind()匹配

org.kodein.di.Kodein$NotFoundException:发现2个绑定与bind()匹配
EN

Stack Overflow用户
提问于 2019-12-22 17:57:59
回答 1查看 642关注 0票数 0

我有一个接口WordsDataSource,我使用它实现了两个具体的类,一个是处理本地数据库的WordsLocalDataSource,另一个是处理服务器上在线数据操作的WordsRemoteDataSource。问题是当我尝试使用抽象类名WordsDataSource将这两个类注入到repository类中时,如下所示

代码语言:javascript
复制
DefaultWordsRepository(
     private val wordsRemoteDataSource: WordsDataSource,
     private val wordsLocalDataSource: WordsDataSource) {

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

代码语言:javascript
复制
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中遇到以下问题

代码语言:javascript
复制
org.kodein.di.Kodein$NotFoundException: 2 bindings found that match bind<WordsDataSource>() with ?<WordsFragment>().? { ? }:
        bind<WordsLocalDataSource>() with singleton { WordsLocalDataSource }
        bind<WordsRemoteDataSource>() with singleton { WordsRemoteDataSource }

我尝试过通过简单地通过变量各自的具体类名来声明变量来解决这个问题,比如

代码语言:javascript
复制
DefaultWordsRepository(
     private val wordsRemoteDataSource: WordsRemoteDataSource,
     private val wordsLocalDataSource: WordsLocalDataSource) {

但仍然想知道是否有任何方法来解决这个问题。

我对kodein使用了以下依赖项

代码语言:javascript
复制
implementation "org.kodein.di:kodein-di-generic-jvm:6.3.3"
implementation "org.kodein.di:kodein-di-framework-android-x:6.3.3"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-22 22:59:25

通过编写显式类型,您已经正确地做到了这一点:

代码语言:javascript
复制
DefaultWordsRepository(
     private val wordsRemoteDataSource: WordsRemoteDataSource,
     private val wordsLocalDataSource: WordsLocalDataSource)

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

代码语言:javascript
复制
DefaultWordsRepository(
     private val wordsRemoteDataSource: WordsDataSource,
     private val wordsLocalDataSource: WordsDataSource)

找不到是否需要两个子类型或两个WordsRemoteDataSourceWordsLocalDataSource。因此,您需要显式定义您的类型。甚至,我们可以将WordsRemoteDataSource放在属性wordsLocalDataSource中,因为我们不能依赖变量名。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59443212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档