Dependency injection 在Kodein依赖项注入中,如何将Kodein自身的实例注入到实例中?

Dependency injection 在Kodein依赖项注入中,如何将Kodein自身的实例注入到实例中?,dependency-injection,kotlin,kodein,Dependency Injection,Kotlin,Kodein,在Kodein中,我将模块导入到父模块中,有时这些类需要Kodein的实例,以便以后可以自己进行注入。问题在于此代码: val parentModule=Kodein{ 导入(SomeService.module) } 其中,SomeService.module需要稍后使用Kodein实例,但Kodein尚未创建。稍后将其传递到模块中似乎是个坏主意 在Kodein3.x中,我看到有一个具有全局实例的Kodein conf模块,但我想避免使用全局实例 其他模块或类如何获取Kodein实例 注意:

在Kodein中,我将模块导入到父模块中,有时这些类需要Kodein的实例,以便以后可以自己进行注入。问题在于此代码:

val parentModule=Kodein{
导入(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()
    // ...
}
val kodein = Kodein {
    import(DefaultSomeService.module)
}