Примечание. Похоже, есть ряд вопросов по поводу подобной проблемы, но этот вопрос более специфичен для многомодульного приложения, и ранее предложенные решения не работают
Я запускаю многомодульный проект с одним модулем (модуль Android-студии) для каждого архитектурного слоя (т. Е. Data, Domain, Presentation) и использую Dagger 2 для обеспечения внедрения зависимостей в приложение. В настоящее время у меня есть один компонент Dagger для каждого модуля, который предоставляет зависимости от каждого модуля другим модулям. Упрощенная версия выглядит так:
@Singleton
@Component(modules=[DataModule::class])
DataComponent {
fun tokenRepository(): TokenRepository
fun jobRepository(): JobRepository
}
@Singleton
@Component(modules=[DomainModule::class])
DomainComponent {
fun somethingSingleton(): Something
}
// In Presentation Module
@PerApp
@Component(dependencies = [DataComponent::class, DomainComponent::class])
AppComponent {
fun tokenRepository(): TokenRepository
fun jobRepository(): JobRepository
fun somethingSingleton(): Something
}
Я получил сообщение о том, что компонент Dagger не может зависеть от нескольких компонентов области действия. Однако, поскольку компоненты Data и Domain должны предоставлять синглтоны (например, репозиторий токенов), я должен использовать что-то вроде @Singleton @Provide fun getTokenRepository...
в DataModule
, что требует также DataComponent
для определения области действия.
Я пытался избежать зависимостей компонентов, не создавая DataComponent
и DomainComponent
и вместо этого AppComponent
ссылаясь на DataModule
и DomainModule
, как показано ниже.
@PerApp
@Component(modules = [DataModule::class, DomainModule::class])
AppComponent {
fun tokenRepository(): TokenRepository
fun jobRepository(): JobRepository
fun somethingSingleton(): Something
}
Однако это не работает, если модуль Presentation не объявляет (gradle) зависимости для связанных с данными библиотек, таких как база данных или библиотека кэширования, которые используются для реализации хранилища. Я чувствую, что это разрушит идею модуляции, так как эти зависимости не должны быть проблемой уровня презентации.
Мне было интересно, если у кого-то была такая же проблема раньше, и как вы ее решили?
Спасибо