2

在我的应用程序中,我有两个模块:apprepository.
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 设置以实现我想要的?


编辑:
我尝试provideRepository按照@David Medenjak 评论进行内部设置,现在 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
4

1 回答 1

1

在查看了 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.

于 2019-05-11T14:09:08.287 回答