В моем приложении у меня есть два модуля: app
и repository
.
repository
зависит от комнаты и имеет интерфейс GoalRepository
:
interface GoalRepository
и GoalRepositoryImpl
класс, который является внутренним, как Я не хочу показывать его или зависимость Room от других модулей :
@Singleton
internal class GoalRepositoryImpl @Inject constructor(private val dao: GoalDao) : GoalRepository
app
зависит от repository
, чтобы получитьGoalRepository
instance.
У меня есть 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