Dagger/Hilt中Assisted Inject绑定接口实现的正确写法及简化方案咨询
方案正确性说明
你当前的实现完全符合Dagger的绑定规则和Assisted Inject的使用规范,是正确可用的实现。你的思路本质是通过接口多态实现工厂返回值的向上转型,以此隐藏实现类ImplClass、只暴露InterfaceA给调用方,逻辑完全通顺。
更精简的实现方案
你现有的方案存在可以省略的样板代码,Dagger的@AssistedFactory原生支持工厂方法直接返回接口类型,只要方法参数和@AssistedInject构造函数中标记了@Assisted的参数类型、数量、顺序完全匹配即可,不需要额外定义两层工厂接口,也不需要单独写Module做绑定,精简后的代码如下:
interface InterfaceA {} class ImplClass @AssistedInject constructor(@Assisted someClass: SomeClass): InterfaceA { @AssistedFactory interface Factory { fun create(someClass: SomeClass): InterfaceA } }
直接注入ImplClass.Factory调用create方法即可得到InterfaceA类型的实例,原有功能完全一致,省去了额外的子工厂接口定义和Module绑定代码。
补充说明
如果你的业务场景中确实存在需要同时获取InterfaceA类型和ImplClass具体类型实例的需求,也可以直接在同一个@AssistedFactory接口里定义两个方法,不需要做接口继承:
@AssistedFactory interface Factory { fun createAsInterface(someClass: SomeClass): InterfaceA fun createAsImpl(someClass: SomeClass): ImplClass }
Dagger会自动生成两个方法的实现,同样不需要额外绑定。
内容的提问来源于stack exchange,提问作者Ritt
相关产品推荐
相关产品推荐

