我有一个接口WordsDataSource,我使用它实现了两个具体的类,一个是处理本地数据库的WordsLocalDataSource,另一个是处理服务器上在线数据操作的WordsRemoteDataSource。问题是当我尝试使用抽象类名WordsDataSource将这两个类注入到repository类中时,如下所示
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"发布于 2019-12-22 22:59:25
通过编写显式类型,您已经正确地做到了这一点:
DefaultWordsRepository(
private val wordsRemoteDataSource: WordsRemoteDataSource,
private val wordsLocalDataSource: WordsLocalDataSource)当使用子类型时,我们不知道该选择哪种实现。写作
DefaultWordsRepository(
private val wordsRemoteDataSource: WordsDataSource,
private val wordsLocalDataSource: WordsDataSource)找不到是否需要两个子类型或两个WordsRemoteDataSource或WordsLocalDataSource。因此,您需要显式定义您的类型。甚至,我们可以将WordsRemoteDataSource放在属性wordsLocalDataSource中,因为我们不能依赖变量名。
https://stackoverflow.com/questions/59443212
复制相似问题