在 Kodein 中,我将模块导入到父模块中,有时这些类需要 Kodein 的一个实例,以便他们以后可以自己进行注入(inject)。问题是这段代码:

val parentModule = Kodein {
    import(SomeService.module)
}
SomeService.module 稍后需要 Kodein 实例,但 Kodein 尚未创建。稍后将其传递到模块中似乎是一个坏主意。
在 Kodein 3.x 我看到有一个具有全局实例的 kodein-conf 模块,但我想避免全局。
其他模块或类如何获取 Kodein 实例?
注意: 这个问题是由作者 ( Self-Answered Questions ) 有意编写和回答的,因此常见问题的 Kotlin/Kodein 主题的惯用答案出现在 SO 中。

最佳答案

在 Kodein 3.x(也可能是旧版本)中,您可以访问任何名为 kodein 的模块的初始化中的属性,您可以在绑定(bind)中使用该属性。

在你的模块中,绑定(bind)看起来像:

bind<SomeService>() with singleton { SomeService(kodein) }

对于一个完整的示例并使用接口(interface)与实现的分离,它可能看起来像这样:
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)
}

关于dependency-injection - 在 Kodein 依赖注入(inject)中,如何将 Kodein 本身的实例注入(inject)到实例中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38572796/

10-10 01:02