在Kodein中,我将模块导入到父模块中,有时这些类需要一个Kodein实例,以便以后可以自己注入。问题是这段代码:
val parentModule = Kodein {
import(SomeService.module)
}
SomeService.module
以后需要Kodein实例,但Kodein尚未创建。稍后将其传递给模块似乎是一个坏主意。
在Kodein 3.x
我看到有kodein-conf
模块有一个全局实例,但我想避免全局。
其他模块或类如何获得Kodein实例?
注意: 这个问题是由作者(Self-Answered Questions)故意编写和回答的,因此对于常见问题Kotlin的惯用答案/ Kodein主题出现在SO中。
答案 0 :(得分: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)
}