Dépendances de composants - Utilisez cette option lorsque vous souhaitez conserver deux composants indépendants.
Sous-composants - Utilisez cette option lorsque vous souhaitez conserver deux composants couplés.
J'utiliserai l'exemple ci-dessous pour expliquer les dépendances et les sous- composants des composants . Quelques points à noter à propos de l'exemple sont:
SomeClassA1
peut être créé sans aucune dépendance. ModuleA
fournit et instance de SomeClassA1
via la provideSomeClassA1()
méthode.
SomeClassB1
ne peut pas être créé sans SomeClassA1
. ModuleB
ne peut fournir une instance de SomeClassB1
que si une instance de SomeClassA1
est passée en argument à provideSomeClassB1()
method.
@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 se chargera de transmettre l'instance de SomeClassA1
comme argument à la provideSomeClassB1()
méthode ModuleB
chaque fois que la déclaration du composant / sous-composant ModuleB
est initialisée. Nous devons indiquer à Dagger comment remplir la dépendance. Cela peut être fait soit en utilisant la dépendance de composant ou sous- composant .
Dépendance des composants
Notez les points suivants dans l'exemple de dépendance de composant ci-dessous:
ComponentB
doit définir la dépendance via la dependencies
méthode sur l' @Component
annotation.
ComponentA
n'a pas besoin de déclarer ModuleB
. Cela maintient les deux composants indépendants.
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();
}
}
Sous-composant
Notez les points suivants dans l'exemple SubComponent:
- Comme
ComponentB
n'a pas défini la dépendance ModuleA
, il ne peut pas vivre de manière indépendante. Il devient dépendant du composant qui fournira le ModuleA
. Par conséquent, il a un@Subcomponent
annotation.
ComponentA
a déclaré ModuleB
via la méthode d'interface componentB()
. Cela rend les deux composants couplés. En fait, ComponentB
ne peut être initialisé que via 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
dépend deSomeClassA1
.ComponentA
doit définir explicitement la dépendance." ==> avez-vous voulu dire "ComponentB
doit définir explicitement la dépendance"?SomeClassB1
dépend deSomeClassA1
. N'aComponentA
pas besoin de définir explicitement la dépendance." vous vouliez dire "ilComponentB
n'est pas nécessaire de définir explicitement la dépendance".Selon la documentation :
Component Dependency
vous donne accès uniquement aux liaisons exposées en tant que méthodes de mise à disposition via les dépendances de composants, c'est-à-dire que vous n'avez accès qu'aux types déclarés dans le parentComponent
.SubComponent
vous donne un accès à l' ensemble du graphe de liaison depuis son parent lorsqu'il est déclaré, c'est-à-dire que vous avez un accès à tous les objets déclarés dans sonModule
s.Le mot Let, vous avez un
ApplicationComponent
contenant toutesAndroid
choses connexes (LocationService
,Resources
,SharedPreference
, etc.). Vous voulez également avoir votreDataComponent
endroit où vous gérez les choses pour la persistance etWebService
pour gérer les API. La seule chose qui vous manque,DataComponent
c'est de savoirApplication Context
qui résideApplicationComponent
. Le moyen le plus simple d'obtenir unContext
deDataComponent
serait une dépendance surApplicationComponent
. Vous devez vous assurer que vous avez unContext
explicitement déclaré dansApplicationComponent
car vous n'avez accès qu'aux éléments déclarés. Dans ce cas, il n'y a pas de travail manuel, ce qui signifie que vous n'avez pas besoin de spécifierSubmodules
dans parentComponent
et d'ajouter explicitement votre sous-module à un module parent comme:Maintenant , considérons ce cas où vous voulez injecter à
WebService
partirDataComponent
et àLocationService
partirApplicationComponent
dans votreFragment
qui se fixe à l' aide de la@Submodule
plus
fonction ci - dessus. Ce qui est cool ici, c'est que le composant auquel vous liez (ApplicationComponent
) n'a pas besoin d'exposerWebService
niLocationService
parce que vous avez accès à l'ensemble du graphique tout de suite.la source
@Submodule
. Est-ce une faute de frappe?classes
d'exemples et plus d'images pour illustrer le point exact.Voici l'exemple de code avec capture d'écran pour plus de compréhension de Component et SubComponent:
Composant:
Sous-composant:
Et le diagramme pictural:
Source: lien
la source
Une autre chose dont je n'avais pas vraiment conscience jusqu'à présent, c'est que:
@Subcomponent
instance a exactement un composant parent (bien que différents composants puissent l'instancier@Subcomponent
et être le parent de cette instance)@Component
peut avoir zéro, un ou plusieurs composants «parents» déclarés via les dépendances de composantsla source