4

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

val parentModule = Kodein {
    import(SomeService.module)
}

以后哪里SomeService.module需要 Kodein 实例,但尚未创建 Kodein。稍后将其传递到模块中似乎是个坏主意。

在 Kodein 中3.x,我看到有kodein-conf一个具有全局实例的模块,但我想避免使用全局实例。

其他模块或类如何获取 Kodein 实例?

注意: 这个问题是作者有意编写和回答的(自我回答的问题),因此常见的 Kotlin/Kodein 主题的惯用答案出现在 SO 中。

4

1 回答 1

4

在 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)
}
于 2016-07-25T16:16:53.493 回答