2016-10-26 5 views
0

間の依存関係、私はいくつかのスコープとAndroidのプロジェクトに取り組んでいます:ダガー2 - 私はこのような何かを組織してサブコンポーネント

@Scope 
public @interface @ScopeA {} 

public class ElementA { 
    @Inject 
    DependencyAa dependencyAa; 
} 

@Module 
public class ElementAModule { 
    private ElementA elementA; 

    public ElementAModule(ElementA elementA){ 
     this.elementA = elementA; 
    } 

    @ScopeA 
    @Provides 
    public ElementA providesElementA(){ 
     return this.elementA; 
    } 
} 

public class ElementB { 
    @Inject 
    DependencyB dependencyB; 
} 

@Module 
public class ElementBModule { 
    private ElementB elementB; 

    public ElementBModule(ElementB elementB){ 
     this.elementB = elementB; 
    } 

    @ScopeA 
    @Provides 
    public ElementB providesElementB(){ 
     return this.elementB; 
    } 
} 

ロングストーリーが短い、私がきたいくつかの要素(A、B)を作りましたそれぞれに依存性(A、B 、それぞれ)が注入されています。だから私の質問は、この種の依存性のための最良のアプローチは何ですか?

すべての依存関係の一般的なモジュールを含む各要素の1つのサブコンポーネント。

@Module 
public class DependenciesModule { 

    @ScopeA 
    @Provides 
    public DependencyAa providesDependencyAa(){ 
     // return DependencyAa 
    } 

    @ScopeA 
    @Provides 
    public DependencyB providesDependencyAb(){ 
     // return DependencyB 
    } 

} 

@ScopeA 
@Subcomponent(modules = { ElementAModule.class , DependenciesModule.class }) 
public interface ElementASubcomponent { 
    void inject(ElementA elementA); 
} 

@ScopeA 
@Subcomponent(modules = {ElementBModule.class , DependenciesModule.class}) 
public interface ElementBSubcomponent { 
    void inject(ElementB elementB); 
} 

1つの一般的な要素サブコンポーネントは、一般的な依存関係モジュールに依存します。これはカスタムスコープでどのように機能しますか?対応する依存関係が

@Module 
public class ElementAModule { 
    private ElementA elementA; 

    public ElementAModule(ElementA elementA){ 
     this.elementA = elementA; 
    } 

    @ScopeA 
    @Provides 
    public ElementA providesElementA(){ 
     return this.elementA; 
    } 

    @ScopeA 
    @Provides 
    public DependencyAa providesDependencyAa(){ 
     // return DependencyAa 
    } 
} 

を設けただけでElementXModuleにdependends各エレメントの

@ScopeA 
@Subcomponent(modules = {ElementAModule.class , 
    ElementBModule.class , DependenciesModule.class}){ 

    void inject(ElementA elementA); 
    void inject(ElementB elementB); 

} 

一つのサブコンポーネントは、また、任意の他の提案は歓迎以上ですか!

ありがとうございます

答えて

0

ここでは2つの質問があります:モジュールを構成する方法とスコープで作業する方法です。

Moduleのインスタンスをどのように構成するかは、依存関係が実際には関連しているかどうかによって異なります。そこここで提供されるのに十分な情報を正確に決定することはおそらくないですが、あなたは自分自身を求めることができる:DependencyADependencyBはどんなElement、たとえば、ElementCを構築するために一緒に使用されることを万が一に

ありますか?もしそうでなければ、それらはおそらく別々のモジュールにあるべきです。もちろん、論理的なまとまりの中で一緒にグループ化したいユースケースには、ある種の類似点があります。たとえば、永続性に関連するすべての依存関係を1つのモジュールにまとめることができます。

2番目の質問では、サブコンポーネントを使用してオブジェクトグラフを下に移動すると、より広い範囲からより狭い範囲に移動することができます。したがって、最上位のコンポーネントでは、アプリケーションのシングルトンを持つことができます。次に、範囲が狭いサブコンポーネント、おそらくアクティビティの依存関係。 「兄弟」スコープのコンポーネントは、相互にメンバーにアクセスすることはできませんが、親コンポーネントから公開されたメンバーにアクセスできます。

スコープを使用するAndroidプロジェクトの良い例はhereです。 この場合、ユースケースごとにモジュールに依存関係がグループ化されています。

+0

ありがとう、今私は理解しています –

関連する問題