org.kodein.di.Kodein$NotFoundException: 找到 2 个匹配 bind() 的绑定



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

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

并在应用程序类中添加依赖项,例如

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"

通过编写显式类型,您已经以正确的方式完成了此操作:

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新