Фон
В соответствии с документами зависимость между подкомпонентами одноуровневого элемента невозможна, поэтому остальным способом остается зависимость компонента. Я пытаюсь инкапсулировать класс «Репозиторий», чтобы пользовательский интерфейс мог обращаться только к экземпляру «Репозитория», а не к деталям реализации «Репозитория». Я имею в виду, что ничего из ApiModule не должно быть открыто.
ApiModule
@Module
class ApiModule {
@Provides
fun provideConnection(): Connection = //....
}
RepositoryModule
@Module (
includes = [
ApiModule::class
]
)
abstract class RepositoryModule {
@Provides
fun providesRepository(connection Connection): Repository = //.....
}
AppComponent
@Component (modules = [
AppModule::class,
RepositoryModule::class
])
interface AppComponent{
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
}
Задача
Теперь, если я создаю подкомпонент (скажем, ActivitySubComponent ) из AppComponent , все привязки в модулях RepositoryModule и ApiModule будут доступны этому подкомпоненту. Однако я хочу, чтобы только "Репозиторий" был доступен из ActivitySubComponent
Предлагаемое решение
Создать RepositoryComponenet и ActivityComponent компоненты составляют AppComponenet их зависимость:
AppComponent
@Component (modules = [
AppModule::class
])
interface AppComponent{
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
}
ActivityComponent
@Component(dependencies = [AppComponent::class], modules = [ActivityModule::class])
interface ActivityComponent {
fun inject(mainActivity: MainActivity)
@Component.Builder
interface Builder{
fun appComponent(appComponent: AppComponent): Builder
fun build(): ActivityComponent
}
}
RepositoryComponent
@Component(dependencies = [AppComponent::class], modules = [RepositoryModule::class])
interface RepositoryComponent {
}
Проблема заключается в том, как мне представить экземпляр "Repository" в одноуровневом элементе ActivityComponent привязки или @Inject
в MainActivity? Будем благодарны за любые объяснения, предложения по изменению моей конфигурации или ссылки на статьи, которые могут решить мою проблему.