首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Kodein依赖项注入,我不想到处传递kodein实例

使用Kodein依赖项注入,我不想到处传递kodein实例
EN

Stack Overflow用户
提问于 2016-07-25 16:33:54
回答 1查看 2.4K关注 0票数 2

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

代码语言:javascript
复制
val kodeinGlobal: Kodein = Kodein { ... }

但是,当一些模块在不同的项目中重复使用时,这是行不通的,而且我们不能很容易地共享这个实例。也许一个单独的模块只是为了保持全局才能工作,但是它需要是一个var,我希望它不会变。

Kodein能自己找到一个主要的、顶级的或全球范围的范围吗?

备注:这个问题是作者(https://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/)故意写和回答的,所以常见的Kotlin/Kodein主题的习语答案就在中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-25 16:33:54

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

使用预定义的全局和引用Kodein.global一样容易。它的工作原理与任何可配置的Kodein实例相同:

代码语言:javascript
复制
Kodein.global.addImport(someModule) // add other modules to it

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

如果你想让你自己的全球化:

代码语言:javascript
复制
val kodeinGlobal = ConfigurableKodein()

有关ConfigurableKodein的更多信息,请阅读ConfigurableKodein文档和预定义的全局实例上帝情结:一个真正的科丁

作为一个助手,您可以使用新的KodeinGlobalAware接口在类中自然地访问Kodein实例,而不必直接引用全局Kodein实例。例如,通过添加此接口,您只需调用实例创建方法,如:

代码语言:javascript
复制
class DefaultSomeService(): SomeService, KodeinGlobalAware {
    val mapper: ObjectMapper = instance()
    // ...
}

或者,如果您有一种情况(如测试),除非被特定实例覆盖,否则您希望使用全局实例,则可以执行以下类似的操作:

代码语言:javascript
复制
class DefaultSomeService(override val kodein: Kodein = Kodein.global): SomeService, KodeinAware {
    val mapper: ObjectMapper = instance()
    // ...
}

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

如果您只想注入Kodein,不管它是全局实例还是特定实例,请参阅:在绑定声明中注入Kodein实例作为替代。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38573125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档