我不确定 Dagger2 的 @Bind 注释的目的。
从我在网上阅读的内容来看,我仍然不清楚,但这里有一个例子:
@Module
public abstract class HomeModule {
@Binds
public abstract HomePresenter bindHomePresenter(HomePresenterImp
homePresenterImp);
}
类定义如下所示:
public interface HomePresenter {
Observable<List<User>> loadUsers();
}
public class HomePresenterImp implements HomePresenter {
public HomePresenterImp(){
}
@Override
public Observable<List<User>> loadUsers(){
//Return user list observable
}
}
如果我只能使用 provides 注释,为什么我需要使用 @Binds 如下:
@Provides
public HomePresenter provideHomePresenter() {
return new HomePresenterImp();
}
@Binds 而不是 @Provides 的用例是什么?如果我使用@Binds,我还需要在我的应用程序组件中声明它吗(当我使用@Binds 时它是一个抽象类)?
原文由 j2emanue 发布,翻译遵循 CC BY-SA 4.0 许可协议
@Binds
可以完全等同于@Provides
方法,如下所示:…尽管您可能更喜欢将 HomePresenterImp 作为方法参数的变体,它让 Dagger 实例化 HomePresenterImp(假设它有一个 @Inject 构造函数),包括传递它需要的任何依赖项。你也可以做这个
static
,所以 Dagger 不需要实例化你的 Module 实例来调用它。那你为什么要选择
@Binds
呢? Dagger 有一个关于它的常见问题解答,但它归结为以下原因:static
也将完成此操作,但如果您忘记了static
,您的@Provides 方法仍将编译。 @Binds 方法不会。Provider<HomePresenterImp>
转换为Provider<HomePresenter>
并且只保留一个,而不是为 HomePresenter 保留一个,它只为 HomePresenterImp 调用一个。因此,整个事情将被很好地表示为: