在 Kodein 3.x 中,有一个名为 kodein-conf 的新模块可用。这允许您创建一个可修改的 Kodein 实例(只要您在第一次注入完成之前对其进行修改),如果需要,它还包含一个用于共享使用的 Kodein 全局实例。这与普通的 Kodein 实例相反,后者必须在构建时定义所有绑定并且永远不能修改。
使用预定义的全局就像引用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 接口在您的类中自然访问 Kodein 实例,而无需直接引用全局 Kodein 实例。比如添加这个接口,就可以调用实例创建方法,如:
class DefaultSomeService(): SomeService, KodeinGlobalAware {
val mapper: ObjectMapper = instance()
// ...
}
或者,如果您有一个案例(例如测试)想要使用全局实例,除非被特定实例覆盖,您可以执行类似的操作:
class DefaultSomeService(override val kodein: Kodein = Kodein.global): SomeService, KodeinAware {
val mapper: ObjectMapper = instance()
// ...
}
它使用KodeinAware 接口并覆盖其抽象成员变量kodein 在类中执行相同的透明类型注入,同时默认为global 实例。
如果您只想注入 Kodein,无论是全局实例还是特定实例,请参阅:Injecting Kodein instances within binding declarations 作为替代方案。