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

Posted

技术标签:

【中文标题】如何使用 Koin 依赖注入 (Kotlin) 检索与给定类型匹配的所有实例【英文标题】:How to retrieve all instances that matches a given type using Koin Dependency Injection (Kotlin) 【发布时间】:2019-06-19 19:22:30 【问题描述】:

您如何使用 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&lt;IValidator&gt; by kodein.allInstances()

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

谢谢!

【问题讨论】:

【参考方案1】:

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

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

然后用getAll&lt;TInterface&gt;请求全部

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

并使用bind&lt;TInterface, TImplementation&gt; 请求单个实例

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

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

【讨论】:

【参考方案2】:

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

 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

请随意添加其他解决方案!

【讨论】:

@shkschneider 现在的问题是,您不能单独注入它们,而只能作为验证器列表注入。我暂时接受答案。希望 Koin 在不久的将来支持注入相同类型的列表。谢谢!

以上是关于如何使用 Koin 依赖注入 (Kotlin) 检索与给定类型匹配的所有实例的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android/Kotlin App 上通过 Koin 注入在 BaseActivity 中初始化/注入通用 ViewModel

如何在 Room MVVM 架构中实现 Koin 依赖注入

FragmentFactory + Koin 实现Fragment依赖注入

如何在 Koin 中提供基类?

Koin快速入门——Android ViewModel

为啥 Koin 在我的 KMM 应用程序中抛出“未捕获的 Kotlin 异常:kotlin.native.IncorrectDereferenceException”?