2016-07-25 186 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) 
}