You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Koin迁移到Dagger Hilt:如何注入自定义接口的所有实现实例?

在Dagger Hilt中注入接口的所有实现实例列表

要在Dagger Hilt中实现和Koin里getAll()一样的批量注入效果,需要让Hilt把接口的所有实现收集到集合中,具体步骤如下:

  1. 修改接口绑定,添加集合收集注解
    你已经用@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方法)

  1. 注入集合并使用
    有两种方式获取所有实现的列表:

方式一:直接注入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:30:48