2017-05-02 13 views
-1

Dagger2はかなり新しいです。私は次のような構造を持っているとしましょう:Dagger2とネストされた子の注射

public class A extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     DependencyInjector.applicationComponent.inject(this); 
    } 
    ... 

    public void foo() { 
     B b = new B(); 
     **DependencyInjector.applicationComponent.inject(b);** 
    } 
} 

public class B { 
    @Inject 
    C c; 
} 

私の質問は、私は「A」は、既に注入され、すべてが、明示的に「b」を注入しなければなりませんの?それとも、「A​​」を注入すれば十分ですか?

答えて

1

はい、この例では、newへの呼び出しのすべての場合と同様に、明示的にBを注入する必要があります。ダガーはその呼び出しを妨げることはできません。あなたの答えのための

public class A extends Activity { 
    @Inject Provider<B> bProvider; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     DependencyInjector.applicationComponent.inject(this); 
    } 
    ... 

    public void foo() { 
     B b = bProvider.get(); // This instance will be fully injected. 
    } 
} 
+0

Thxを:あなたはBを注入する必要はありませんので

はしかし、注入され、ダガー-作成Providerに延期することによって、あなたはAの注入を利用することができます。そして、より良い方法は何でしょう? – davidOhara

+0

Daggerに注射可能なオブジェクトの作成を任せる方が良いという点で、私がコードサンプルで持っている方法は「良い方法」です。 Androidや他のフレームワークがあなたのために作成するオブジェクトのための 'inject'メソッドの使用を保存します。あなたのオブジェクトグラフに参加する必要のないモデルオブジェクトのような単純なオブジェクトに対しても、 'new'を使うことができます。 [注射剤]対 "新製品"(http://misko.hevery.com/2008/09/30/to-new-or-not-to-new/)を参照してください。 –

+0

"c"も注射されますか? – davidOhara

関連する問題