2 回答

TA貢獻1851條經驗 獲得超3個贊
假設您需要@Binds或@Provides首先是錯誤的。您可以而且應該使用構造函數注入——不是模式,而是Dagger 為我生成代碼。
您已經有了用 注釋的構造函數@Inject,因此 Dagger 知道該類以及如何創建它。沒有別的事可做。
public class SomeDependency {
@Inject
public SomeDependency() {
}
}
對于您的這個簡單用例,您不需要任何@Provides,不@Binds,甚至不需要 a 。@Module您的示例應該開箱即用,因為兩個構造函數都使用@Inject.
@Component
public interface ApplicationComponent {
Application build();
}
如果您需要指定范圍,可以將其添加到類中。
@Provides應該用于不能使用構造函數注入的代碼,或者需要額外設置的代碼。當然,您可以手動創建所有對象(就像您在示例中所做的那樣),但這并沒有真正的好處,只會產生很多可以避免的樣板。
@Binds將與您需要綁定到接口的實現一起使用。最佳情況下,您也可以使用構造函數注入來實現,但您也可以將其添加到組件構建器 ( ) 或在帶注釋的方法@BindsInstance中創建它。@Provides
@Binds MyInterface bindMyImplementation(MyImplementation implementation);

TA貢獻1757條經驗 獲得超8個贊
如果您的類標有@Inject構造函數:
public class SomeDependency {
@Inject // <----
public SomeDependency() {
}
}
然后,僅當您需要將其“綁定”為接口的實現或至少與其具體類型不同的類型時,才需要@Binds(或)。@Provides
另外,如果你的對象有一個@Inject構造函數,你不需要在模塊中實例化它,因為 Dagger 已經知道如何實例化它。
因此,要修復您的代碼,您需要做的就是:
// @Module
// abstract class ApplicationModule {
// @Provides
// static SomeDependency provideDepdendencyOne() {
// return new SomeDependency();
// }
// }
解決了。
添加回答
舉報