代码之家  ›  专栏  ›  技术社区  ›  Piotr Aleksander Chmielowski

当每个接口有一个实现时,automatic@binds in dagger

  •  1
  • Piotr Aleksander Chmielowski  · 技术社区  · 7 年前

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

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

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

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

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

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   Jeff Bowman    7 年前

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

    Dagger无法确定只有一个实现,唯一的方法是搜索(编译)类路径上的每个类,试图找到各种可能的实现。这充其量是缓慢的,但Java允许从定制的定制器中派生出来,所以 you aren't ever really guaranteed to get a full list of available classes . 即使您声称dagger应该只与它看到的第一个适当的可分配类型匹配(因为您知道只有一个),dagger可能无法确定在哪里找到该实现类型。

    最终很难在一条线上改进 @Binds 语句,该语句标识绑定密钥(your.package.name.loginservice)和目标(your.package.name.loginserviceimpl)的完全限定类。