dependency-injection - 使用 Kodein 依赖注入(inject),我不想到处传递 kodein 实例

标签 dependency-injection kotlin kodein

使用 Kodein,我发现我必须传递 kodein 实例或将它们注入(inject)到模块和类中。但有时我的类(class)是如此脱节,我希望他们能够发现“一个真正的 Kodein”。由于这是一个服务器端应用程序,并且我只有一个 Kodein 范围,因此应该很容易。我可以创建一个全局对象,例如:

val kodeinGlobal: Kodein = Kodein { ... }

但是,当某些模块在不同的项目中重复使用时,这不起作用,并且我们无法轻松共享这个实例。也许一个单独的模块只是为了保存全局可以工作,但它需要是一个 var 并且我希望它不可更改。

Kodein 能否自行找到主作用域、顶级作用域或全局作用域?

注意: 这个问题是作者特意编写和回答的 ( Self-Answered Questions ),以便对常见的 Kotlin/Kodein 主题进行惯用的回答存在于 SO 中。

最佳答案

在 Kodein 3.x 中,有一个名为 kodein-conf 的新模块。这允许您创建一个可修改的 Kodein 实例(只要您在第一次注入(inject)完成之前修改它),并且如果需要的话,它还包含一个供共享使用的 Kodein 全局实例。这与普通的 Kodein 实例相反,普通的 Kodein 实例必须在构造时定义所有绑定(bind),并且永远不能修改。

使用预定义的全局就像引用 Kodein.global 一样简单。它的工作方式与任何可配置的 Kodein 实例相同:

Kodein.global.addImport(someModule) // add other modules to it

val something: SomethingCool = Kodein.global.instance() // inject from it

如果你想打造自己的全局化:

val kodeinGlobal = ConfigurableKodein()

有关 ConfigurableKodein 的更多信息,请阅读 Kodein 3.x docs for ConfigurableKodein ,以及关于预定义全局实例 The God Complex: One True Kodein

作为助手,您可以使用新的 KodeinGlobalAware 接口(interface)在类中自然访问 Kodein 实例,而无需直接引用全局 Kodein 实例。例如添加这个接口(interface),就可以直接调用实例创建方法,如:

class DefaultSomeService(): SomeService, KodeinGlobalAware {
    val mapper: ObjectMapper = instance()
    // ...
}

或者,如果您在某种情况下(例如测试)想要使用全局实例,除非用特定实例覆盖,则可以执行类似以下操作:

class DefaultSomeService(override val kodein: Kodein = Kodein.global): SomeService, KodeinAware {
    val mapper: ObjectMapper = instance()
    // ...
}

它使用 KodeinAware 接口(interface)并覆盖其抽象成员变量 kodein 在类中执行相同的透明类型注入(inject),同时默认为 global 实例。

如果您只想注入(inject) Kodein,无论是全局实例还是特定实例,请参阅:Injecting Kodein instances within binding declarations作为替代方案。

关于dependency-injection - 使用 Kodein 依赖注入(inject),我不想到处传递 kodein 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38573125/

相关文章:

.net-core - .net 核心在代码中的任何位置手动解析依赖项

ASP.net vnext 依赖注入(inject)

dependency-injection - Windsor 能否与另一个 IoC 容器合作?

android - 数据绑定(bind)中的 msg :Cannot find the getter for attribute 'android:text' with value type java. lang.String?

kotlin - 克隆的 ArrayList 上的 joinToString 如何抛出 ConcurrentModificationException

generics - ASP.NET Core 中的通用存储库在 Startup.cs 中的每个表中没有单独的 AddScoped 行?

android - Koin 安卓测试

kotlin - Kodein + Ktor = 卡住 kotlin.collections.HashMap 的突变尝试 - 为什么?

android - 无法解析 org.kodein.di :kodein-di-framework-android

android - 依赖图在 Koin 或 Kodein 中如何工作?