Dagger 1 のplus()
方法は、以前のアプリケーションでよく使用していたものなので、親グラフ バインディングへのフル アクセス権を持つサブコンポーネントが必要になる状況は理解できます。
どのような状況でコンポーネントの依存関係代わりにサブコンポーネントの依存関係なぜ?
ベストアンサー1
コンポーネントの依存関係 - 2 つのコンポーネントを独立した状態に保つ場合に使用します。
サブコンポーネント - 2 つのコンポーネントを結合したままにしたい場合に使用します。
以下の例を使って説明しますコンポーネントの依存関係そしてサブコンポーネントこの例で注目すべき点は次のとおりです。
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
メソッドの引数として渡します。依存関係を満たす方法をDaggerに指示する必要があります。これはprovideSomeClassB1()
、ModuleB
ModuleB
コンポーネントの依存関係またはサブコンポーネント。
コンポーネントの依存関係
以下のコンポーネント依存関係の例では、次の点に注意してください。
ComponentB
dependencies
アノテーションのメソッドを介して依存関係を定義する必要があります@Component
。ComponentA
を宣言する必要はありませんModuleB
。これにより、2 つのコンポーネントが独立した状態になります。
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 の例では、次の点に注意してください。
ComponentB
は への依存関係を定義していないためModuleA
、独立して存在することはできません。 は を提供するコンポーネントに依存するようになりますModuleA
。そのため、 にはアノテーションがあります@Subcomponent
。ComponentA
ModuleB
は、インターフェース メソッド を介して宣言されていますcomponentB()
。これにより、2 つのコンポーネントが結合されます。実際、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);
}
}