2016-11-26 3 views
0

たとえば、次のようにします。Dagger2で別のインスタンスを挿入するには

  • MyActivityという名前のアクティビティがあります。
  • A、Bという2つのクラスがあり、MyActivityにはこれらのクラスインスタンスがあります。
  • 私はA &に注入したいCという名前のクラスがあります。
  • Cには活動のライフサイクルに従うスコープがあります。

このような状況では、スコープに関係なく、Dagger 2を使用してCの別のインスタンスをA、Bに渡す方法はありますか?

+1

http://stackoverflow.com/a/40447384/7045114 –

+0

[のオブジェクトを提供する方法の可能な複製同じタイプですか? Dagger2](http://stackoverflow.com/questions/40447262/how-to-provide-objects-of-the-same-type-dagger2) –

答えて

2

qualifiersを使用する必要があります。 dagger user's guideの修飾子セクションから:

場合によっては、タイプだけでは依存関係を特定するには不十分です。この場合、 に修飾子アノテーションを追加します。あなたのケースでは

、単なるCはあなたがABに注入する2つの異なる依存性を識別するのに十分ではありません。したがって、2つのインスタンスを区別する修飾子を追加します。次に例を示します。

public class A { 

    private final C c; 

    @Inject 
    public A(@Named("Instance 1") C c) { 
     this.c = c; 
    } 
} 

public class B { 
    private final C c; 

    @Inject 
    public B(@Named("Instance 2") C c) { 
     this.c = c; 
    } 
} 

モジュール:

@Module 
public class CModule() { 

    @Provides 
    @Named("Instance 1") 
    C provideInstance1OfC() { 
     return new C(); 
    } 

    @Provides 
    @Named("Instance 2") 
    C provideInstance2OfC() { 
     return new C(); 
    } 
} 

コンポーネント:最後に

@Component(modules = { CModule.class }) 
public interface ActivityComponent { 
    void inject(MyActivitiy activity); 
} 

public class MyActivity extends Activity { 
    @Inject A a; 
    @Inject B b; 

    @Override 
    void onCreate() { 
     super.onCreate(); 
     DaggerActivityComponent.builder() 
      .cModule(new CModule()) 
      .build() 
      .inject(this); 
    } 
} 
+0

はい、なぜ私はこのように考えることができませんでしたか?あなたは聖人です。ありがとう。 –

関連する問題