Ответ 1
Зависимости компонентов - используйте это, когда:
- вы хотите сохранить независимые компоненты.
- вы хотите явно указать, какие зависимости от одного компонента используются другим
Подкомпоненты - используйте это, когда:
- вы хотите сохранить двухкомпонентную связность
- вам может не понадобиться явно указывать, какие зависимости от одного компонента используются другим
Я попытаюсь показать это и пример. Учитывая, что мы имеем ниже модули и классы. 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);
}
}