当每个接口有一个实现时,在Dagger中自动@Binds

时间:2018-05-30 20:16:07

标签: dagger-2

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

我不认为这是可能的,甚至是假设的。

Dagger无法真正告诉我们只有一个实现,并且唯一的方法是搜索(编译)类路径上的每个类以尝试查找各种​​可能的实现。这样做最好,但Java允许从自定义类加载器进行类加载,因此you aren't ever really guaranteed to get a full list of available classes。即使您声称Dagger应该与它看到的第一个适当的可分配类型匹配(因为您知道只有一个),Dagger可能无法确定在哪里找到该实现类型。

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