многомодульный проект с кинжалом: компонент зависит от нескольких компонентов - PullRequest
0 голосов
/ 01 мая 2018

Примечание. Похоже, есть ряд вопросов по поводу подобной проблемы, но этот вопрос более специфичен для многомодульного приложения, и ранее предложенные решения не работают

Я запускаю многомодульный проект с одним модулем (модуль 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) зависимости для связанных с данными библиотек, таких как база данных или библиотека кэширования, которые используются для реализации хранилища. Я чувствую, что это разрушит идею модуляции, так как эти зависимости не должны быть проблемой уровня презентации.

Мне было интересно, если у кого-то была такая же проблема раньше, и как вы ее решили?

Спасибо

...