如何使用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)内是否有可能。
谢谢!
答案 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
随时添加其他解决方案!