Создание подкомпонента, наследующего зависимости от разных компонентов

В последнее время я много работаю с Dagger 2, и у меня есть конкретный вариант использования, который я не могу сделать так, как хочу, по разным причинам: 1) это невозможно; 2) Я просто не понимаю концепции областей действия и компонентов/подкомпонентов.

У меня есть 3 компонента: AppComponent, DBComponent, ActivityComponent.

Мне нужно, чтобы моя активность наследовала зависимости от AppComponent и DBComponent. Это моя следующая установка:

Компонент приложения:

@Singleton
@Component(modules = { AppModule.class }) {
   EventBus bus()
   ActivityComponent plus(ActivityModule activityModule);
}

Компонент базы данных:

@Database
@Component(dependencies = AppComponent.class, modules = DatabaseModule.class) {
   ActivityDependency activityDependency();
}

Компонент Активности:

@PerActivity
@Subcomponent(modules = ActivityModule.class) {
   void inject(MainActivity activity);
}

Когда я внедряю bus(), все работает нормально, но как только я пытаюсь внедрить ActivityDependency(), он просто не работает. Я не могу понять, почему...

Обратите внимание: я прочитал почти все сообщения здесь и за его пределами, объясняющие области действия, компоненты и подкомпоненты, и до сих пор не могу понять, как добиться того, чего я хотел.

Примечание 2. Я знаю один способ исправить это: добавить DatabaseModule.class в качестве модуля в AppComponent и удалить DatabaseComponent из уравнения. Но я чувствую, что это сделает AppComponent слишком большим количеством информации, и это не совсем правильный путь.


person Peddro    schedule 10.08.2016    source источник


Ответы (1)


наследовать зависимости от AppComponent и DBComponent.

Неправильный. Вам нужно наследовать зависимости от AppComponent, а содержимое DBComponent должно быть модулем AppComponent.

Примечание 2. Я знаю один способ исправить это: добавить DatabaseModule.class в качестве модуля в AppComponent и удалить DatabaseComponent из уравнения. Но я чувствую, что это сделает AppComponent слишком большим количеством информации, и это не совсем правильный путь.

Да, это лучший способ, если вы используете зависимости с областью действия.


Думайте о зависимости наследование как о ключевом слове extends в Java.

Вы не можете расширить несколько классов одним и тем же классом, не так ли?

Точно так же вы не можете расширять несколько компонентов с областью действия.

Поэтому, если вы хотите, чтобы ваш граф предоставлял привязки для заданной области, тогда ваш компонент должен иметь все модули для этой заданной области. И @Database на самом деле не область (подумайте о жизненных циклах), это переименованное @Singleton.

person EpicPandaForce    schedule 10.08.2016
comment
Я никогда не думал о зависимостях как о расширениях, и это имеет смысл. И да, масштаб как жизненные циклы также имеет смысл. И с учетом этого наверняка база данных будет @singleton - person Peddro; 10.08.2016