使用Kodein,我发现我必须传递kodein实例或将它们注入到模块和类中。但有时我的类是如此断开,我希望它们能够发现“一个真正的Kodein”。因为这是一个服务器端应用程序,而且我只有一个Kodein范围,所以应该很容易。我可以创建一个全局对象,例如:
val kodeinGlobal: Kodein = Kodein { ... }但是,当一些模块在不同的项目中重复使用时,这是行不通的,而且我们不能很容易地共享这个实例。也许一个单独的模块只是为了保持全局才能工作,但是它需要是一个var,我希望它不会变。
Kodein能自己找到一个主要的、顶级的或全球范围的范围吗?
备注:这个问题是作者(https://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/)故意写和回答的,所以常见的Kotlin/Kodein主题的习语答案就在中。
发布于 2016-07-25 16:33:54
在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的更多信息,请阅读ConfigurableKodein文档和预定义的全局实例上帝情结:一个真正的科丁
作为一个助手,您可以使用新的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,不管它是全局实例还是特定实例,请参阅:在绑定声明中注入Kodein实例作为替代。
https://stackoverflow.com/questions/38573125
复制相似问题