使用Dagger 2时,我经常使用以下模式:
LoginService
使用构造函数注入创建唯一一个实现 - LoginServiceImpl
:
class LoginServiceImpl implements LoginService {
@Inject LoginServiceImpl() {}
}
将实现绑定到界面:
@Binds
abstract LoginService bindStatisticsService(LoginServiceImpl impl);
在这种情况下,始终依赖于界面 - LoginService
。
是否有可能避免@Binds
带注释的方法?有没有更简单的(用更少的样板代码)方式来告诉Dagger - 这个类是接口的唯一一个实现,总是绑定它例如在接口本身的一些注释中? / p>
我已经阅读了文档,很遗憾没有找到类似的东西,但也许有人知道一些可以解决我问题的技巧。
答案 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)。