Komponentenabhängigkeiten - Verwenden Sie diese Option, wenn Sie zwei Komponenten unabhängig halten möchten.
Unterkomponenten - Verwenden Sie diese Option, wenn zwei Komponenten gekoppelt bleiben sollen.
Ich werde das folgende Beispiel verwenden, um Komponentenabhängigkeiten und Unterkomponenten zu erläutern . Einige Punkte, die es wert sind, über das Beispiel bemerkt zu werden, sind:
SomeClassA1
kann ohne Abhängigkeit erstellt werden. ModuleA
bietet und Instanz SomeClassA1
über die provideSomeClassA1()
Methode.
SomeClassB1
kann nicht ohne erstellt werden SomeClassA1
. ModuleB
kann eine Instanz von SomeClassB1
nur bereitstellen, wenn eine Instanz von SomeClassA1
als Argument an die provideSomeClassB1()
Methode übergeben wird.
@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 sorgt dafür, dass die Instanz von SomeClassA1
als Argument an die provideSomeClassB1()
Methode übergeben wird, ModuleB
wenn die Deklaration der Komponente / Unterkomponente ModuleB
initialisiert wird. Wir müssen Dolch anweisen, wie die Abhängigkeit zu erfüllen ist. Dies kann entweder mithilfe der Komponentenabhängigkeit oder der Unterkomponente erfolgen .
Komponentenabhängigkeit
Beachten Sie die folgenden Punkte im folgenden Beispiel für die Komponentenabhängigkeit:
ComponentB
muss die Abhängigkeit über die definieren dependencies
Methode auf @Component
Annotation.
ComponentA
muss nicht deklarieren ModuleB
. Dies hält die beiden Komponenten unabhängig.
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();
}
}
Unterkomponente
Beachten Sie die folgenden Punkte im SubComponent-Beispiel:
- Da
ComponentB
die Abhängigkeit von nicht definiert wurde ModuleA
, kann sie nicht unabhängig leben. Es wird abhängig von der Komponente, die das bereitstellt ModuleA
. Daher hat es eine @Subcomponent
Anmerkung.
ComponentA
hat ModuleB
über die Schnittstellenmethode deklariert componentB()
. Dadurch werden die beiden Komponenten gekoppelt. In der Tat ComponentB
kann nur über initialisiert werden 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);
}
}
SomeClassB1
ist abhängig vonSomeClassA1
.ComponentA
muss die Abhängigkeit explizit definieren." ==> hast du gemeint "ComponentB
muss die Abhängigkeit explizit definieren"?SomeClassB1
abhängig vonSomeClassA1
. MussComponentA
die Abhängigkeit nicht explizit definieren". Sie meinten "ComponentB
müssen die Abhängigkeit nicht explizit definieren."Laut Dokumentation :
Component Dependency
Sie haben nur Zugriff auf die Bindungen, die als Bereitstellungsmethoden über Komponentenabhängigkeiten verfügbar gemacht werden, dh Sie haben nur Zugriff auf Typen, die im übergeordneten Element deklariert sindComponent
.SubComponent
Ermöglicht Ihnen den Zugriff auf das gesamte Bindungsdiagramm von seinem übergeordneten Diagramm aus, wenn es deklariert ist, dh Sie haben Zugriff auf alle Objekte, die in seinemModule
s deklariert sind .Lassen Sie uns sagen, Sie haben ein
ApplicationComponent
alles enthält , wasAndroid
damit zu tun (LocationService
,Resources
,SharedPreference
, usw.). Sie möchten auch,DataComponent
wo Sie Dinge für die Persistenz verwalten undWebService
mit APIs umgehen. Das einzige, was Ihnen fehlt,DataComponent
istApplication Context
das, in dem Sie wohnenApplicationComponent
. Der einfachste Weg , eine zu bekommenContext
ausDataComponent
würde eine Abhängigkeit von seinApplicationComponent
. Sie müssen sicher sein, dass Sie eineContext
explizit deklarierte haben,ApplicationComponent
da Sie nur Zugriff auf deklarierte Inhalte haben. In diesem Fall gibt es keine manuelle Arbeit, dh Sie müssen nichtSubmodules
imComponent
übergeordneten Modul angeben und Ihr Submodul explizit einem übergeordneten Modul hinzufügen, z.Betrachten Sie nun den Fall, in dem Sie
WebService
vonDataComponent
undLocationService
nachApplicationComponent
in Ihren injizieren möchten,Fragment
der mithilfe der@Submodule
plus
obigen Funktion bindet . Das Coole dabei ist, dass die Komponente, an die Sie binden (ApplicationComponent
), weder verfügbar gemacht werden mussWebService
nochLocationService
weil Sie sofort Zugriff auf das gesamte Diagramm haben.quelle
@Submodule
. Ist es ein Tippfehler?classes
als Beispiele und mehr Bilder zu haben, um den genauen Punkt zu veranschaulichen.Hier ist das Codebeispiel mit Screenshot zum besseren Verständnis von Component und SubComponent:
Komponente:
Unterkomponente:
Und das Bilddiagramm:
Quelle: Link
quelle
Eine andere Sache, die ich bis jetzt nicht ganz realisiert habe, ist folgende:
@Subcomponent
Instanz hat genau eine übergeordnete Komponente (obwohl verschiedene Komponenten dieselbe instanziieren@Subcomponent
und die übergeordnete Komponente dieser Instanz sein können).@Component
kann null, eine oder viele "übergeordnete" Komponenten haben, die durch Komponentenabhängigkeiten deklariert wurdenquelle