在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) }