Dagger 2 サブコンポーネントとコンポーネント依存関係 質問する

Dagger 2 サブコンポーネントとコンポーネント依存関係 質問する

Dagger 1 のplus()方法は、以前のアプリケーションでよく使用していたものなので、親グラフ バインディングへのフル アクセス権を持つサブコンポーネントが必要になる状況は理解できます。

どのような状況でコンポーネントの依存関係代わりにサブコンポーネントの依存関係なぜ?

ベストアンサー1

コンポーネントの依存関係 - 2 つのコンポーネントを独立した状態に保つ場合に使用します。

サブコンポーネント - 2 つのコンポーネントを結合したままにしたい場合に使用します。


以下の例を使って説明しますコンポーネントの依存関係そしてサブコンポーネントこの例で注目すべき点は次のとおりです。

  • SomeClassA1依存関係なしで作成できます。メソッドを介してModuleAのインスタンスを提供します。SomeClassA1provideSomeClassA1()
  • SomeClassB1なしでは作成できませんSomeClassA1。のインスタンスがメソッドに引数として渡された場合にのみ、ModuleBのインスタンスを提供できます。SomeClassB1SomeClassA1provideSomeClassB1()
@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()ModuleBModuleBコンポーネントの依存関係またはサブコンポーネント

コンポーネントの依存関係

以下のコンポーネント依存関係の例では、次の点に注意してください。

  • ComponentBdependenciesアノテーションのメソッドを介して依存関係を定義する必要があります@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
  • ComponentAModuleBは、インターフェース メソッド を介して宣言されています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);
    }
}

おすすめ記事