首页 > 解决方案 > 当每个接口有一个实现时,Dagger 中的自动 @Binds

问题描述

使用 Dagger 2 时,我经常应用以下模式:

  1. 创建接口,我们称之为LoginService
  2. 创建唯一的一个实现 -LoginServiceImpl使用构造函数注入:

    class LoginServiceImpl implements LoginService {
       @Inject LoginServiceImpl() {}
    }
    
  3. 将实现绑定到接口:

    @Binds
    abstract LoginService bindStatisticsService(LoginServiceImpl impl);
    
  4. 始终依赖于接口 -LoginService在这种情况下。

是否有可能避免使用带@Binds注释的方法?是否有一种更简单(使用更少的样板代码)的方法来告诉 Dagger -这个类是接口的唯一一个实现,总是在接口本身的一些注释中绑定它?

我已经阅读了文档,不幸的是没有找到类似的东西,但也许有人知道一些可以解决我的问题的技巧。

标签: dagger-2

解决方案


我认为这是不可能的,即使是假设性的。

Dagger 无法真正判断只有一个实现,唯一的方法是搜索(编译)类路径上的每个类以尝试找到各种可能的实现。这充其量会很慢,但是 Java 允许从自定义类加载器进行类加载,因此您无法真正保证获得可用类的完整列表。即使您声称 Dagger 应该只匹配它看到的第一个适当的可分配类型(因为您知道只有一个),Dagger 也可能无法确定在哪里可以找到该实现类型。

最终,很难改进@Binds识别绑定键 (your.package.name.LoginService) 和目标 (your.package.name.LoginServiceImpl) 的完全限定类的单行语句。


推荐阅读