2016-07-25 157 views
4

在Kodein中,我将模块导入到父模块中,有时这些类需要Kodein的一个实例,以便稍后可以自行注入。问题是这样的代码:在Kodein依赖注入中,如何将Kodein本身的实例注入实例?

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

SomeService.module需要Kodein实例后,但尚未创建Kodein。稍后将它传递给模块似乎是个不错的主意。

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

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

注:这个问题是故意写的,并回答了作者(Self-Answered Questions),这样就常见的成语答案科特林/ Kodein主题存在于SO。

回答

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