Dagger2 中 @Binds 与 @Provides 注释的用例是什么

新手上路,请多包涵

我不确定 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 许可协议

阅读 1.1k
2 个回答

@Binds 可以完全等同于 @Provides 方法,如下所示:

 @Provides
public HomePresenter provideHomePresenter() {
    return new HomePresenterImp();
}

…尽管您可能更喜欢将 HomePresenterImp 作为方法参数的变体,它让 Dagger 实例化 HomePresenterImp(假设它有一个 @Inject 构造函数),包括传递它需要的任何依赖项。你也可以做这个 static ,所以 Dagger 不需要实例化你的 Module 实例来调用它。

 @Provides
public static HomePresenter provideHomePresenter(HomePresenterImp presenter) {
    return presenter;
}

那你为什么要选择 @Binds 呢? Dagger 有一个关于它的常见问题解答,但它归结为以下原因:

  • @Binds(稍微)更紧凑:您可以跳过实现。
  • @Binds 在接口和抽象类中工作,这对于 @BindsOptionalOf 和 @ContributesAndroidInjector 等 Dagger 特性是严格要求的。
  • @Binds 帮助你的代码保持高效。 @Provides 方法可以是实例方法,需要 Dagger 实例化您的模块才能调用它们。制作您的@Provides 方法 static 也将完成此操作,但如果您忘记了 static ,您的@Provides 方法仍将编译。 @Binds 方法不会。
  • @Binds 防止 Dagger 必须代码生成并为对象保留一个单独的工厂/提供者,因为 Java 不向 Dagger 提供访问权限以了解实现如此简单。在您的情况下,Dagger 可以将 Provider<HomePresenterImp> 转换为 Provider<HomePresenter> 并且只保留一个,而不是为 HomePresenter 保留一个,它只为 HomePresenterImp 调用一个。

因此,整个事情将被很好地表示为:

 @Binds abstract HomePresenter bindHomePresenter(HomePresenterImp presenter);

原文由 Jeff Bowman 发布,翻译遵循 CC BY-SA 4.0 许可协议

感谢这个来源: https ://www.valueof.io/blog/inject-provides-binds-dependencies-dagger-hilt

@绑定:

  • 单参数
  • 更少的代码

但是使用@Binds的好处是减少了生成的代码量(比如Module Factory类 在此处输入图像描述 秒)。生成的代码更少意味着 Kapt 插件要做的工作更少,这可以加快大型项目的构建时间。

@Binds 是一个非常专业的注解——它用于将接口映射到实现。它只能接受一个参数,类型返回是给定参数对象实现的接口。

如果要绑定的实现采用构造函数参数,则可以使用 @Inject 和 @Binds 的组合,如下例所示:

原文由 user12927542 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题