在 Kodein 依赖注入中,如何将 Kodein 本身的实例注入到实例中?
In Kodein dependency injection, how can you inject instances of Kodein itself into instances?
在 Kodein 中,我将模块导入到父模块中,有时 类 需要一个 Kodein 实例,以便他们以后可以自己进行注入。问题是这段代码:
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<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)
}
在 Kodein 中,我将模块导入到父模块中,有时 类 需要一个 Kodein 实例,以便他们以后可以自己进行注入。问题是这段代码:
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<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)
}