componenti Dipendenze - Utilizzare questo quando:
- si desidera mantenere due componenti indipendenti.
- si vuole mostrare in modo esplicito ciò che dipendenze da un componente viene utilizzato dagli altri
sottocomponenti - Utilizzare questa funzione quando:
- si desidera mantenere due componenti coesa
- si potrebbe non cura per mostrare esplicitamente quale dipendenza da un componente viene utilizzata dall'altro
Proverò a mostrare questo e l'esempio. Dato che abbiamo i seguenti moduli e classi.SomeClassB1
dipende da SomeClassA1
. Notare il metodo provideSomeClassB1
in ModuleB
che mostra questa dipendenza.
@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;
}
}
Nota i seguenti punti nell'esempio Dipendenza Componente seguito:
SomeClassB1
dipende SomeClassA1
. ComponentB
deve definire esplicitamente la dipendenza.
ComponentA
non ha bisogno di dichiarare ModuleB
. Ciò mantiene indipendenti le due componenti.
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();
}
}
Nota i seguenti punti nell'esempio Sottocomponente:
SomeClassB1
dipende SomeClassA1
. ComponentB
non è necessario definire esplicitamente la dipendenza.
ComponentA
deve dichiarare ModuleB
. Questo rende accoppiati i due componenti.
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);
}
}
fonte
2015-05-09 01:55:36
Ho una configurazione sottocomponente che non aggiunge Modulo B a Componenta, che poi significa che il costruttore Componenta non ha bisogno moduleB. Questo sembra funzionare come mi aspettavo permettendo la creazione di ComponentA all'avvio dell'applicazione e quindi l'istanziazione di m – FriendlyMikhail
Non credo che sia necessario dichiarare ModuleB nell'annotazione di ComponentA. In questo modo è possibile creare un'istanza di ComponentA all'avvio dell'applicazione e quindi creare ComponentBs con ambito, ad esempio per richiesta o per attività. Sembra funzionare in modo molto simile a come "plusing" ha funzionato in Dagger1 – FriendlyMikhail
@MikeN - Puoi evidenziare come puoi sbarazzarti di ModuleB su ComponentA? Posso sbarazzarmi di ModuleB su ComponentA solo se fornisco ambiti diversi su ComponentA e ComponentB. –