2017-03-05 14 views
2

コンポーネントにモジュールの内容を伝え、コンポーネントのコンポーネントの依存関係を伝えることの違いを理解できません。例えばモジュールと依存関係の差異

@Module public class ModuleA { 
    @Provides DependencyA providesDependencyA() { 
     return new DependencyA(); 
    } 
} 

@Module public class ModuleB { 
    @Provides DependencyB providesDependencyB() { 
     return new DependencyB(); 
    } 
} 

@Component (modules = {ModuleA.class}) 
public interface ComponentA { 
    DependencyA getDependencyA(); 
} 

が、この違いは何か:

@Component (modules = {ModuleA.class, ModuleB.class}) 
public interface ComponentB { 
    DependencyB getDependencyB(); 
} 

そしてそれ:あなたの簡単なケースでは

@Component (dependencies = {ComponentA.class}, modules = {ModuleB.class}) 
public interface ComponentB { 
    DependencyB getDependencyB(); 
} 

答えて

1

が、彼らはほぼ同じに振る舞います。あなたが望むならば、ダガーのコンポーネント依存関係の扱いは、プロビジョニングメソッド(0引数のファクトリメソッド)をそれぞれのインスタンスに委譲する@Providesメソッドの依存関係にラップする自動生成モジュールをインストールするかのように考えることができますどちらの場合でも、Daggerは消費するモジュール/依存性メソッドに委譲するFactory/Providerクラスの実装を生成します。

はしかし、これらを含め、いくつかの大きな違いがあります:

  • モジュールは、あなたのオブジェクトグラフから調達し、他の任意のメソッドごとのパラメータを取ることができます。コンポーネントの依存関係におけるプロビジョニングメソッドは、ゼロ引数でなければなりません。これは最も重要な違いです。コンポーネントの依存関係は、純粋な外部ファクトリであり、オブジェクトグラフの完全な参加者ではありません。
  • モジュールプロビジョニングメソッドは、Daggerがそれらを消費するために@Providesと宣言されなければなりません。これは、露出ゼロのargメソッドも可能にします。コンポーネントの依存関係は、すべての単一ゼロ引数メソッドを潜在的なプロバイダとして扱います。
  • モジュールには@Moduleという注釈を付ける必要があります。コンポーネントの依存関係は任意のタイプ(は必ずしも@Component - 注釈付きインスタンス)である必要はなく、Daggerがそれを生成するかどうかに関わらず実装を渡すことができます。
  • モジュールとモジュールメソッドのスコープがチェックされます。それらは、囲みコンポーネントのスコープと互換性がなければなりません。コンポーネントの依存関係はスコープチェックされません。
  • モジュールは、抽象クラスまたはインターフェイスにすることができ、@Bindsを使用してグラフ内で宣言的なバインディングを表現できます。コンポーネント依存関係は、定義によるインスタンスであり、オブジェクトグラフ内の何にもアクセスできません。
  • もちろん、モジュールは使用するサブコンポーネントまたは他のモジュールへの依存関係を宣言できます。コンポーネントの依存関係は、どちらも実行できません。彼らはちょうど外部の工場です。
  • インスタンス化可能なモジュールは、引数がゼロのpublicメソッドがある場合、コンポーネントビルダーで指定する必要はありません。コンポーネントの依存性must be provided、具体的な型を提供していたとしても、Daggerはインスタンス化できます。要するに

、あなたのグラフ外部から外部宣言としてのグラフおよびコンポーネントの依存性の構成としてモジュールを扱います。上で説明した狭いオーバーラップ以外は、どのクラスに対してどのロールが望ましいかははっきりしているはずです。

関連する問題