在我的应用程序中,我有两个模块:app
和repository
。
repository
取决于Room,并具有一个GoalRepository
界面:
interface GoalRepository
和内部的GoalRepositoryImpl
类,因为我不想将其或Room依赖项公开给其他模块:
@Singleton
internal class GoalRepositoryImpl @Inject constructor(private val dao: GoalDao) : GoalRepository
app
依赖repository
来获得GoalRepository
实例。
我现在有一个GoalRepositoryModule
:
@Module
class GoalRepositoryModule {
@Provides
@Singleton
fun provideRepository(impl: GoalRepositoryImpl): GoalRepository = impl
@Provides
@Singleton
internal fun provideGoalDao(appDatabase: AppDatabase): GoalDao = appDatabase.goalDao()
@Provides
@Singleton
internal fun provideDatabase(context: Context): AppDatabase =
Room.databaseBuilder(context, AppDatabase::class.java, "inprogress-db").build()
}
问题在于,(显然)由于公共provideRepository
函数公开GoalRepositoryImpl
(即internal
类)而无法编译。
如何构造我的Dagger设置以实现我想要的?
编辑:
我尝试按照@David Medenjak的注释将provideRepository
内部化,现在Kotlin编译器抱怨说它无法解决RoomDatabase依赖性:
Supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath:
class xxx.repository.database.AppDatabase, unresolved supertypes: androidx.room.RoomDatabase
为完整起见,请参见app
模块中我组件的代码:
@Component(modules = [ContextModule::class, GoalRepositoryModule::class])
@Singleton
interface SingletonComponent
答案 0 :(得分:0)
查看了Dagger生成的代码后,我了解到错误是使@Component
模块内部的app
依赖于@Module
模块内部的repository
。
因此,我在@Component
模块中创建了一个单独的repository
,并使app
模块的模块依赖于此。
repository
模块的组件:
@Component(modules = [GoalRepositoryModule::class])
interface RepositoryComponent {
fun goalRepository(): GoalRepository
}
app
的一个:
@Component(modules = [ContextModule::class], dependencies = [RepositoryComponent::class])
@Singleton
interface SingletonComponent
通过这种方式,RepositoryComponent
负责构建Repository
并了解其所有依赖性,而SingletonComponent
只需要了解RepositoryComponent
。