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();
// }
// }
解决了。
添加回答
举报