Подкомпоненты Dagger 2 и зависимости компонентов

Метод plus() Dagger 1 – это то, что я использовал довольно часто в предыдущих приложениях, поэтому я понимаю ситуации, когда вы можете захотеть иметь подкомпонент с полным доступом к привязкам родительских графов.

В какой ситуации было бы полезно использовать зависимость компонента, а не зависимость от подкомпонентов и почему?

4 Solutions collect form web for “Подкомпоненты Dagger 2 и зависимости компонентов”

Зависимости компонентов. Используйте это, когда:

  • вы хотите сохранить два независимых компонента.
  • вы хотите явно указать, какие зависимости от одного компонента используются другим

Подкомпоненты – используйте это, когда:

  • вы хотите сохранить двухкомпонентную связность
  • вы можете не указывать явно, какие зависимости от одного компонента используются другим

Я попытаюсь показать это и пример. Учитывая, что мы имеем ниже модули и classы. SomeClassB1 зависит от SomeClassA1 . Обратите внимание на метод provideSomeClassB1 в ModuleB который показывает эту зависимость.

 @Module public class ModuleA { @Provides public SomeClassA1 provideSomeClassA1() { return new SomeClassA1(); } } @Module public class ModuleB { @Provides public SomeClassB1 provideSomeClassB1(SomeClassA1 someClassA1) { return new SomeClassB1(someClassA1); } } public class SomeClassA1 { public SomeClassA1() {} } public class SomeClassB1 { private SomeClassA1 someClassA1; public SomeClassB1(SomeClassA1 someClassA1) { this.someClassA1 = someClassA1; } } 

Обратите внимание на следующие пункты в примере зависимости компонентов:

  • SomeClassB1 зависит от SomeClassA1 . ComponentB должен явно определять зависимость.
  • ComponentA не нужно объявлять ModuleB . Это обеспечивает независимость двух компонентов.
 public class ComponentDependency { @Component(modules = ModuleA.class) public interface ComponentA { SomeClassA1 someClassA1(); } @Component(modules = ModuleB.class, dependencies = ComponentA.class) public interface ComponentB { SomeClassB1 someClassB1(); } public static void main(String[] args) { ModuleA moduleA = new ModuleA(); ComponentA componentA = DaggerComponentDependency_ComponentA.builder() .moduleA(moduleA) .build(); ModuleB moduleB = new ModuleB(); ComponentB componentB = DaggerComponentDependency_ComponentB.builder() .moduleB(moduleB) .componentA(componentA) .build(); } } 

Обратите внимание на следующие пункты примера SubComponent:

  • SomeClassB1 зависит от SomeClassA1 . ComponentB не должен явно определять зависимость.
  • ComponentA должен объявить ModuleB . Это приводит к соединению двух компонентов.
 public class SubComponent { @Component(modules = ModuleA.class) public interface ComponentA { ComponentB componentB(ModuleB moduleB); } @Subcomponent(modules = ModuleB.class) public interface ComponentB { SomeClassB1 someClassB1(); } public static void main(String[] args) { ModuleA moduleA = new ModuleA(); ComponentA componentA = DaggerSubComponent_ComponentA.builder() .moduleA(moduleA) .build(); ModuleB moduleB = new ModuleB(); ComponentB componentB = componentA.componentB(moduleB); } } 

Согласно документации :

Component Dependency дает вам доступ только к связям, открытым в качестве методов предоставления через зависимости компонентов, т. Е. У вас есть доступ только к типам, которые объявляются в родительском Component .

SubComponent дает вам доступ ко всему графику привязки от его родителя при его объявлении, т. SubComponent вас есть доступ ко всем объектам, объявленным в его Module s.

Скажем, у вас есть ApplicationComponent содержащий все связанные с Android вещи ( LocationService , Resources , SharedPreference и т. Д.). Вы также хотите иметь свой DataComponent где вы управляете вещами для настойчивости вместе с WebService для работы с API. Единственное, чего вам не хватает в DataComponent это Application Context который находится в ApplicationComponent . Самый простой способ получить Context из DataComponent – это зависимость от ApplicationComponent . Вы должны быть уверены, что у вас есть Context явно объявленный в ApplicationComponent потому что у вас есть доступ к объявленным материалам. В этом случае нет ручной работы, то есть вам не нужно указывать Submodules в родительском Component и явно добавлять ваш подмодуль к родительскому модулю, например:

 MySubcomponent mySubcomponent = myComponent.plus(new ChildGraphModule("child!")); // No need! 

Теперь рассмотрим тот случай, когда вы хотите вставить WebService из DataComponent и LocationService из ApplicationComponent в свой Fragment который связывается с помощью функции @Submodule plus выше. Самое замечательное в том, что компонент, которому вы привязываетесь ( ApplicationComponent ), не должен выставлять WebService или LocationService потому что сразу у вас есть доступ ко всему графику.

Еще одна вещь, которую я до сих пор не совсем понял, такова:

  • Экземпляр @Subcomponent имеет ровно один родительский компонент (хотя разные компоненты могут создавать тот же @Subcomponent и быть родителем этого экземпляра)
  • @Component может иметь ноль, один или многие родительские компоненты, объявленные через зависимости компонентов

Вот пример кода с скриншотом для лучшего понимания Component и SubComponent:

Компонент: введите описание изображения здесь

  1. AppComponent содержит два объявления.
  2. AppComponent инициализирует class App.
  3. HomeActivityComponent зависит от AppComponent.
  4. В HomeActivity при инициализации DaggerHomeActivityComponent я предоставляю объект AppComponent в качестве композиции.

подкомпоненте:

введите описание изображения здесь

  1. AppComponent содержит SubComponent или SubComponents.
  2. AppComponent инициализирует class App.
  3. SubComponent не знает о своем ParentComponent. Это обеспечивает только собственные зависимости, включая модуль.
  4. В HomeActivity я вставляю SubComponent с помощью его родительского компонента.

И графическая схема: введите описание изображения здесь

Источник: ссылка

Interesting Posts

Включая зависимости в банке с Maven

Показывать данные о наведении указателя на круг

Bash: отображает каждый размер подкаталога в формате списка с помощью 1 строки?

Переименование столбцов результатов из агрегации Pandas («FutureWarning: использование dict с переименованием устарело»)

Как я могу предотвратить внезапные звуковые пики во время игр?

Преобразование из долготы \ широты в декартовы координаты

Что эквивалентно C ++ Pair в Java?

Показать «Страница X of Y», используя одно текстовое поле

Как обрабатывать iframe в Selenium WebDriver с помощью java

Могут ли диски SAS работать на материнской плате SATA

CSS-анимация с задержкой для каждого дочернего элемента

андроиды выбирают изображения из галереи

Linux-инструмент для измельчения PDF-файлов на несколько страниц

Панель действий Android SearchView как автозаполнение?

JQuery: создайте HTML в «памяти», а не DOM

Давайте будем гением компьютера.