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

时间:2019-01-25 23:18:37

标签: kotlin ktor koin

如何使用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)内是否有可能。

谢谢!

2 个答案:

答案 0 :(得分:2)

使用Koin 2+,您现在可以分别声明实例

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

答案 1 :(得分:1)

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

 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

随时添加其他解决方案!