Phụ thuộc thành phần - Sử dụng phần này khi bạn muốn giữ hai thành phần độc lập.
Các thành phần con - Sử dụng phần này khi bạn muốn giữ hai thành phần được ghép nối.
Tôi sẽ sử dụng dưới đây ví dụ để giải thích phần phụ thuộc và thành phần phụ . Một số điểm đáng chú ý về ví dụ này là:
SomeClassA1
có thể được tạo ra mà không có bất kỳ sự phụ thuộc. ModuleA
cung cấp và ví dụ SomeClassA1
thông qua provideSomeClassA1()
phương thức.
SomeClassB1
không thể được tạo ra mà không có SomeClassA1
. ModuleB
có thể cung cấp một thể hiện SomeClassB1
chỉ khi một thể hiện của SomeClassA1
được truyền dưới dạng đối số cho provideSomeClassB1()
phương thức.
@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;
}
}
Dagger sẽ đảm nhiệm việc chuyển thể hiện của SomeClassA1
một đối số thành provideSomeClassB1()
phương thức ModuleB
bất cứ khi nào khai báo Thành phần / Thành phần con ModuleB
được khởi tạo. Chúng ta cần hướng dẫn Dagger cách thực hiện sự phụ thuộc. Điều này có thể được thực hiện bằng cách sử dụng phần phụ thuộc hoặc Tiểu hợp phần .
Thành phần phụ thuộc
Lưu ý các điểm sau trong ví dụ phụ thuộc Thành phần bên dưới:
ComponentB
phải xác định sự phụ thuộc thông qua dependencies
phương thức @Component
chú thích.
ComponentA
không cần phải khai báo ModuleB
. Điều này giữ cho hai thành phần độc lập.
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();
}
}
Hợp chất phụ
Lưu ý các điểm sau trong ví dụ SubComponent:
- Như
ComponentB
chưa xác định sự phụ thuộc vào ModuleA
, nó không thể sống độc lập. Nó trở nên phụ thuộc vào thành phần sẽ cung cấp ModuleA
. Do đó nó có một @Subcomponent
chú thích.
ComponentA
đã khai báo ModuleB
thông qua phương thức giao diện componentB()
. Điều này làm cho hai thành phần được ghép nối. Trong thực tế, ComponentB
chỉ có thể được khởi tạo thông qua ComponentA
.
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);
}
}