如何使用Koin依赖注入(Kotlin)检索与给定类型匹配的所有示例

bxgwgixi  于 2023-01-17  发布在  Kotlin
关注(0)|答案(3)|浏览(149)

如何使用Koin DI实现以下功能:

single { AValidator() } bind IValidator::class
single { BValidator() } bind IValidator::class
single { CValidator() } bind IValidator::class
single { DValidator() } bind IValidator::class

在我想要注入所有验证器的类中,我使用以下代码:

val validators: List<IValidator> by inject()

期望接口IValidator的所有不同实现都被自动注入。
我知道这在Kodein中实际上是支持的,在那里您只需执行以下操作:
val validators: List<IValidator> by kodein.allInstances()
很想知道这在Koin内部是否可能。
谢谢!

ubby3x7f

ubby3x7f1#

使用Koin2+,现在可以单独声明示例

single { AValidator() } bind IValidator::class
single { BValidator() } bind IValidator::class
single { CValidator() } bind IValidator::class
single { DValidator() } bind IValidator::class

然后使用getAll<TInterface>请求所有这些文件

val validators: List<IValidator> = getKoin().getAll()
// with lazy
val validators: List<IValidator> by lazy { getKoin().getAll<IValidator>() }

并使用bind<TInterface, TImplementation>请求单个示例

val validator: IValidator = getKoin().bind<IValidator, AValidator>()

来源
https://start.insert-koin.io/#/getting-started/modules-definitions?id=additional-types

t2a7ltrp

t2a7ltrp2#

根据文档,我可以执行如下操作:

single(name = "validators") {
        listOf(AValidator(), BValidator(), CValidator(), DValidator())
    }

并通过以下方式检索:

val validators: List<IValidator> by inject(name = "validators")

它现在可以工作,但是注入上面列表中的单个验证器就不行了。
有关详细信息:https://insert-koin.io/docs/1.0/documentation/reference/index.html
请随意添加其他解决方案!

sczxawaw

sczxawaw3#

内置的Koin getAll()也不适合我,不管是什么版本。所以它要么是一个持续多年的bug,要么是糟糕的文档。然而,这是我的自定义解决方案,koin版本3.3.0

@OptIn(KoinInternalApi::class)
inline fun <reified T : Any> getAllCustom(): List<T> =
    KoinJavaComponent.getKoin().let { koin ->
        koin.instanceRegistry.instances.map { it.value.beanDefinition }
            .filter { it.kind == Kind.Singleton }
            .filter { it.primaryType.isSubclassOf(T::class) }
            .map { koin.get(clazz = it.primaryType, qualifier = null, parameters = null) }
    }

然后像这样提供

single { 
    SomeClass(getAllCustom()) 
}

相关问题