在Kodein依赖注入中,如何将Kodein本身的实例注入实例?
在Kodein中,我将模块导入到父模块中,有时这些类需要Kodein的一个实例,以便稍后进行注入。 问题是这个代码:
val parentModule = Kodein { import(SomeService.module) }
SomeService.module
稍后需要Kodein实例,但Kodein尚未创建。 稍后将它传递给模块似乎是一个坏主意。
在Kodein 3.x
我看到有一个全局实例的kodein-conf
模块,但我想避免全局。
其他模块或类如何获得Kodein实例?
注意: 这个问题是由作者故意编写和回答的( 自我回答问题 ),所以对于常见的Kotlin / Kodein主题的习惯性的回答是存在于SO中的。
在Kodein 3.x
(也可能是旧版本)中,您可以在任何可以在绑定中使用的名为kodein
模块的初始化中访问属性。
在您的模块中,绑定将如下所示:
bind<SomeService>() with singleton { SomeService(kodein) }
有关完整的示例并使用接口与实现的分离,可能看起来像这样:
interface SomeService { // ... } class DefaultSomeService(val kodein: Kodein): SomeService { companion object { val module = Kodein.Module { bind<SomeService>() with singleton { DefaultSomeService(kodein) } } } val mapper: ObjectMapper = kodein.instance() // ... }
您可以按照您的注意事项从父项导入模块,它将接收到自己对当前Kodein实例的引用。
val kodein = Kodein { import(DefaultSomeService.module) }