在Kodein依赖注入中,如何将Kodein本身实例注入实例?

时间:2016-07-25 16:16:53

标签: dependency-injection kotlin kodein

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

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

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

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

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

注意: 这个问题是由作者(Self-Answered Questions)故意编写和回答的,因此对于常见问题Kotlin的惯用答案/ Kodein主题出现在SO中。

1 个答案:

答案 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)
}