2013-08-20 183 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添加到您的注入類。第三個選擇是從@Provides方法返回類,像這樣:

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

但這似乎是多餘的樣板,但與吉斯和其他框架,JIT經驗隨機類的結合真可謂是充斥着錯誤。我們已經看到java.lang.String注入了某些東西,並且因爲有人忘記了綁定它,所以最終注入了「」而不是所需的字符串。因此,Dagger需要一個@Inject的構造函數或者字段(Guice在4.x中有選擇地使用它,儘管爲了向後兼容性,默認情況下它是關閉的)

這是一個少見的例子,Dagger選擇了更多的正確性保證代價是少量的冗長。