从Koin迁移到Dagger Hilt:如何注入自定义接口的所有实现实例?
在Dagger Hilt中注入接口的所有实现实例列表
要在Dagger Hilt中实现和Koin里getAll()一样的批量注入效果,需要让Hilt把接口的所有实现收集到集合中,具体步骤如下:
- 修改接口绑定,添加集合收集注解
你已经用@Binds将实现类绑定到MyInterface,现在需要给每个绑定方法加上@IntoSet注解,告诉Hilt把这些实现实例收集到一个Set<MyInterface>中:
@Binds @IntoSet abstract fun bindFirstMyInterfaceImpl( firstMyInterfaceImpl: FirstMyInterfaceImpl, ): MyInterface @Binds @IntoSet abstract fun bindSecondMyInterfaceImpl( secondMyInterfaceImpl: SecondMyInterfaceImpl, ): MyInterface
(每个MyInterface的实现类都要对应一个带@IntoSet的@Binds方法)
- 注入集合并使用
有两种方式获取所有实现的列表:
方式一:直接注入Set并转为List
直接在MyUseCaseImpl的构造函数中注入Set<MyInterface>,然后在类内部转换为List使用:
@Singleton class MyUseCaseImpl @Inject constructor( private val myInterfaceSet: Set<MyInterface>, ) : MyUseCase { private val myInterfaces = myInterfaceSet.toList() // 业务逻辑中直接使用myInterfaces列表 }
方式二:提供List类型的依赖
如果你希望直接注入List<MyInterface>,可以添加一个@Provides方法,把Set转换为List:
@Module @InstallIn(SingletonComponent::class) object MyInterfaceModule { @Provides fun provideMyInterfaceList( myInterfaceSet: Set<@JvmSuppressWildcards MyInterface> ): List<MyInterface> { return myInterfaceSet.toList() } }
这里的@JvmSuppressWildcards是为了避免Java泛型擦除导致的Dagger类型匹配问题,添加后就可以直接在构造函数中注入List了:
@Singleton class MyUseCaseImpl @Inject constructor( private val myInterfaces: List<MyInterface>, ) : MyUseCase { // 直接使用myInterfaces列表 }
关键说明
默认情况下,Dagger不允许同一个接口存在多个未标记集合绑定的实现(会报重复绑定错误),@IntoSet是告诉Dagger将这些实现统一收集到集合中,这是实现批量注入的核心步骤。
内容的提问来源于stack exchange,提问作者ZookKep
相关产品推荐
相关产品推荐

