2016-05-25 12 views
1

私はActivityまたは他のコンテキストインスタンス(たとえば、Service)であれば、ダガー2の依存関係が異なります。どちらも同じインターフェイスを参照しますが、その実装は異なります。 Dagger 2を使ってどうすれば整理できますか?コンテキストに基づいて異なる実装で同じDagger 2依存関係を挿入する方法は?

次のように今、私は2つの異なるコンポーネント、それぞれのモジュールとActivityComponentContextComponentにしようとしている:

@ActivityScope   
@Subcomponent(   
    modules = {     
    ActivityModule.class,     
    ContextModule.class 
    })   
public interface ActivityComponent { 
} 

@Module  
public class ActivityModule { 

    @Provides 
    @MyActivityQualifier 
    public MyObject provideMyObject() { 
    } 
} 


@ContextScope 
@Subcomponent(  
    modules = { 
    ContextModule.class 
    })  
public interface ContextComponent { } 

@Module 
public class ContextModule.class { 

    @Provides 
    public MyObject provideMyObject() { 
    } 
} 

その後、私はActivityMyObjectを使用している場合は、私が追加する必要があります修飾子は次のようになります。

@Inject @MyActivityQualifier MyObject myObject; 

これは間違っていますが、わかりません。より良い方法がありますか?

答えて

1

サブコンポーネントを使用しています。
質問は、両方のオブジェクトを同時に「可視」(使用可能、注射可能、...)にすることができますか、そうする必要がありますか?

  • はい:あなたは、修飾子のいくつかの並べ替えを使用する必要があります。そうでなければ、それらを区別することはできません。
  • いいえ:依存コンポーネントからの依存関係を公開しないことで、それらを「非表示」にすることができます。この場合、@Subcomponentの代わりに通常のコンポーネントを使用し、親コンポーネントにgetMyInterface()メソッドを追加しないでください。

2つのコンポーネントが互いに依存しているため、他のオプションはありません。だからあなたのアプローチはあなたが提供する情報でうまく見えます。

あなたの実装のうち1つを修飾することもできます。私のプロジェクトでは、ユーザーデータのない共通の実装に資格を持つ@Named("public")注釈を使用します。私が修飾子を追加しないと、もう1つ(修飾されていない)を取得します。


例えば独立コンポーネントとActivityAComponentActivityBComponent異なるモジュールを使用してどの実装が提供されるかを切り替えることができます。

関連する問題