2013-08-20 6 views
15

Daggerを私のプロジェクトで動かそうとしています。デフォルトコンストラクタのダガー

しかし、私は、コンパイル時に私のクラスの一つで、次の例外を取得:

error: No injectable members on Foo. Do you want to add an injectable constructor?

はしかし、クラスには、依存関係を持っていないとのようなデフォルトの引数なしのコンストラクタを使用しています。

public class Foo 
{ 
    ... 
} 

私は本当に以下のような注入可能な引数なしのコンストラクタを追加する必要がありますか?

public class Foo 
{ 
    @Inject 
    public Foo() 
    { 
    } 

    .... 
} 

答えて

21

ダガーは積極的に、いずれかの引数なしのコンストラクタを追加し、または注射フィールドを追加することで、注射用クラスに@Injectを追加する必要があります。しかし、Guiceのと、他のフレームワーク、JITでの経験からランダムクラスの結合はでいっぱいであることが判明し、

@Module(...) 
class MyModule { 
    @Provides Foo provideFoo() { 
    return new Foo(); // Foo is not injectable. 
    } 
} 

これは、余分な定型のように思えるん:第三の選択肢はそうのような@Providesメソッドからクラスを返すことですエラー。私たちはjava.lang.Stringが物に注入されているのを見ました。誰かがそれを忘れてしまったので、目的の文字列の代わりに注入されました。したがって、Daggerは@Injectコンストラクタまたはフィールドを必要とします(Guiceはオプションでこれを4.xに持っていますが、下位互換性のためデフォルトではオフです)

これはDaggerがより正確な保証を選択したまれな例です少々の冗長さを犠牲にして。

関連する問題