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

M A*_*yan 3 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
Run Code Online (Sandbox Code Playgroud)

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

val validators: List<IValidator> by inject()
Run Code Online (Sandbox Code Playgroud)

期望IValidator自动注入所有不同的接口实现。

我知道 Kodein 实际上支持它,您只需执行以下操作:

val validators: List<IValidator> by kodein.allInstances()

很想知道这在 Koin 中是否可行。

谢谢!

Asa*_*pha 7

使用 Koin 2+,您现在可以单独声明您的实例

single { AValidator() } bind IValidator::class
single { BValidator() } bind IValidator::class
single { CValidator() } bind IValidator::class
single { DValidator() } bind IValidator::class
Run Code Online (Sandbox Code Playgroud)


然后用于getAll<TInterface>请求所有这些

val validators: List<IValidator> = getKoin().getAll()
// with lazy
val validators: List<IValidator> by lazy { getKoin().getAll<IValidator>() }
Run Code Online (Sandbox Code Playgroud)


并用于bind<TInterface, TImplementation>请求单个实例

val validator: IValidator = getKoin().bind<IValidator, AValidator>()
Run Code Online (Sandbox Code Playgroud)


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


M A*_*yan 5

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

 single(name = "validators") {
        listOf(AValidator(), BValidator(), CValidator(), DValidator())
    }
Run Code Online (Sandbox Code Playgroud)

并使用以下方法检索它:

val validators: List<IValidator> by inject(name = "validators")
Run Code Online (Sandbox Code Playgroud)

它现在有效,但例如注入上述列表的单个验证器将不起作用。

更多详情:https : //insert-koin.io/docs/1.0/documentation/reference/index.html

随意添加另一个解决方案!