Dagger 1のplus()
方法は、以前のアプリケーションでかなり頻繁に使用したものであるため、親グラフバインディングへの完全なアクセス権を持つサブコンポーネントが必要になる状況を理解しています。
どのような状況で、サブコンポーネントの依存関係の代わりにコンポーネントの依存関係を使用することが有益ですか?なぜですか?
Dagger 1のplus()
方法は、以前のアプリケーションでかなり頻繁に使用したものであるため、親グラフバインディングへの完全なアクセス権を持つサブコンポーネントが必要になる状況を理解しています。
どのような状況で、サブコンポーネントの依存関係の代わりにコンポーネントの依存関係を使用することが有益ですか?なぜですか?
回答:
コンポーネントの依存関係-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は、Component / Subcomponent宣言が初期化されるたびに、のインスタンスをSomeClassA1
引数として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);
}
}
SomeClassB1
依存していSomeClassA1
ます。依存関係ComponentA
を明示的に定義する必要があります。」==>「ComponentB
依存関係を明示的に定義する必要がある」という意味ですか?
SomeClassB1
はに依存していSomeClassA1
ます。依存関係をComponentA
明示的に定義する必要はありません。」「ComponentB
依存関係を明示的に定義する必要がない」という意味です。
ドキュメントによると:
Component Dependency
コンポーネントの依存関係を通じてプロビジョニングメソッドとして公開されたバインディングのみにアクセスできます。つまり、parentで宣言されているタイプのみにアクセスできますComponent
。
SubComponent
宣言すると、親からバインディンググラフ全体にアクセスできます。つまり、Module
sで宣言されているすべてのオブジェクトにアクセスできます。
レッツ・発言、あなたの持っているApplicationComponent
すべて含むAndroid
関連のものを(LocationService
、Resources
、SharedPreference
、など)。また、APIを処理するDataComponent
ために、永続化のために物事を管理する場所も必要ですWebService
。欠けているのDataComponent
は、にApplication Context
あるものだけですApplicationComponent
。取得する最も簡単な方法Context
からは、DataComponent
上の依存関係になりますApplicationComponent
。Context
宣言されApplicationComponent
たものにしかアクセスできないため、明示的に宣言されていることを確認する必要があります。この場合、手動での作業はありません。つまりSubmodules
、親Component
で指定してサブモジュールを親モジュールに明示的に追加する必要はありません。
MySubcomponent mySubcomponent = myComponent.plus(new ChildGraphModule("child!")); // No need!
今、あなたは注入したいというケース考えるWebService
からDataComponent
とLocationService
からApplicationComponent
、あなたにFragment
使ったバインド@Submodule
plus
上記の機能を。ここで素晴らしいのは、バインドしているコンポーネント(ApplicationComponent
)を公開する必要がないこと、WebService
またはLocationService
すぐにグラフ全体にアクセスできることです。
@Submodule
。タイプミスですか?
classes
正確なポイントを説明するために、例としてより少なく、より多くの写真を用意することが役立ちます。
以下は、ComponentとSubComponentの理解を深めるためのスクリーンショット付きのコード例です。
サブコンポーネント:
ソース:リンク
今まで気づかなかったもう1つのことは、
@Subcomponent
(異なる成分が同じをインスタンス化することができるもののインスタンスは、1つの親コンポーネントを有し@Subcomponent
、そのインスタンスの親です)@Component
は、コンポーネントの依存関係を通じて宣言されたゼロ、1、または多くの「親」コンポーネントを持つことができます