การพึ่งพาส่วนประกอบ - ใช้สิ่งนี้เมื่อคุณต้องการให้สององค์ประกอบเป็นอิสระ
ส่วนประกอบย่อย - ใช้สิ่งนี้เมื่อคุณต้องการให้สององค์ประกอบคู่กัน
ฉันจะใช้ด้านล่างตัวอย่างเพื่ออธิบายการพึ่งพาชิ้นส่วนและส่วนประกอบย่อย บางจุดที่ควรสังเกตเกี่ยวกับตัวอย่าง ได้แก่ :
SomeClassA1
สามารถสร้างได้โดยไม่ต้องพึ่งพาใด ๆ ModuleA
ให้และตัวอย่างของSomeClassA1
ผ่านทางprovideSomeClassA1()
วิธีการ
SomeClassB1
SomeClassA1
ไม่สามารถสร้างได้โดยไม่ต้อง ModuleB
สามารถระบุอินสแตนซ์ได้SomeClassB1
ก็ต่อเมื่ออินสแตนซ์SomeClassA1
ถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังprovideSomeClassB1()
เมธอด
@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 จะดูแลการส่งผ่านอินสแตนซ์ของSomeClassA1
เป็นอาร์กิวเมนต์ไปยังprovideSomeClassB1()
วิธีการModuleB
เมื่อใดก็ตามที่ModuleB
มีการเตรียมใช้งานการประกาศ Component / Subcomponent เราจำเป็นต้องสั่งให้ Dagger รู้วิธีเติมเต็มการพึ่งพา ซึ่งสามารถทำได้โดยการใช้การพึ่งพาชิ้นส่วนหรือองค์ประกอบย่อย
การพึ่งพาส่วนประกอบ
สังเกตประเด็นต่อไปนี้ในตัวอย่างการอ้างอิงส่วนประกอบด้านล่าง:
ComponentB
ต้องกำหนดการพึ่งพาผ่านdependencies
วิธีการในการใส่@Component
คำอธิบายประกอบ
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
สังเกตประเด็นต่อไปนี้ในตัวอย่าง SubComponent:
- เนื่องจาก
ComponentB
ไม่ได้กำหนดการพึ่งพาModuleA
จึงไม่สามารถอยู่อย่างอิสระได้ จะขึ้นอยู่กับส่วนประกอบที่จะให้ไฟล์ModuleA
. ดังนั้นจึงมี@Subcomponent
คำอธิบายประกอบ
ComponentA
ได้ประกาศModuleB
ผ่านวิธีการเชื่อมcomponentB()
ต่อ สิ่งนี้ทำให้ทั้งสององค์ประกอบคู่กัน ในความเป็นจริงComponentB
สามารถเริ่มต้นผ่านทาง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);
}
}