У меня 3 репозитория:
interface MainRepository {
...
}
interface LocalRepository {
...
}
interface WebRepository {
...
}
Каждый репозиторий имеет собственную реализацию:
@Singleton
class MainRepositoryImpl @Inject constructor(
private val localRepository: LocalRepository,
private val webRepository: WebRepository
) : MainRepository {
...
}
@Singleton
class LocalRepositoryImpl @Inject constructor(
private val localMapper: LocalMapper
private val popularMovieDao: PopularMovieDao
) : LocalRepository {
...
}
@Singleton
class WebRepositoryImpl @Inject constructor(
private val webMapper: WebMapper,
private val popularMovieApi: PopularMovieApi
) : WebRepository {
...
}
Как видите, MainRepository
необходимо внедрить в него оба других репозитория, однако я не могу понять, как это сделать.
Конечно, я могу ввести его с типом LocalRepositoryImpl
или WebRepositoryImpl
, но я хочу ввести его с типом LocalRepository
или WebRepository
для более общего подхода.
Вот модуль, который я пытался написать:
@InstallIn(ApplicationComponent::class)
@Module
object Module {
@Singleton
@Provides
fun provideWebRepository(): WebRepository {
return WebRepositoryImpl(mapper = WebMapper(), popularMovieApi = PopularMovieApi.getInstance())
}
@Singleton
@Provides
fun provideLocalRepository(): LocalRepository {
return LocalRepositoryImpl(mapper = LocalMapper(), // Here I can't really
// figure out how to get @Dao since it requires DB
// which requires context and etc
// which makes me think that I've got completely wrong approach to this)
}
}
Мой модуль LocalData:
@InstallIn(ApplicationComponent::class)
@Module
object LocalDataSourceModule {
@Singleton
@Provides
fun provideMainDatabase(@ApplicationContext context: Context): MainDatabase = MainDatabase.getInstance(context)
@Provides
fun providePopularMovieDao(mainDatabase: MainDatabase): PopularMovieDao = mainDatabase.popularMovieDao()
}
Мой модуль WebData:
@InstallIn(ApplicationComponent::class)
@Module
object RemoteDataSourceModule {
@Singleton
@Provides
fun providePopularMovieApi(): PopularMovieApi = PopularMovieApi.getInstance()
}
Как мне правильно вводить реализации, которые у меня есть (LocalRepositoryImpl
& WebRepositoryImpl
), сохраняя при этом типы интерфейсов (LocalRepository
& `WebRepository) ??