2016-07-25 17 views
4

In Kodein habe ich Module in ein Elternmodul importiert, und manchmal benötigen die Klassen eine Instanz von Kodein, damit sie später selbst injizieren können. Das Problem ist, dieser Code:Wie können Sie bei Kodein Dependency Injection Instanzen von Kodein selbst in Instanzen injizieren?

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

Wo SomeService.module die kodein Instanz für später benötigt, aber kodein ist noch nicht erstellt. Es später in das Modul zu geben scheint eine schlechte Idee zu sein.

In Kodein 3.x Ich sehe dort ist das kodein-conf Modul, das eine globale Instanz hat, aber ich möchte die globale vermeiden.

Wie erhalten andere Module oder Klassen die Kodein-Instanz?

Hinweis:diese Frage absichtlich geschrieben und beantwortete vom Autor (Self-Answered Questions), so dass die idiomatischen Antworten häufig Kotlin/kodein Themen sind in SO gefragt.

Antwort

4

In kodein 3.x (und vielleicht auch ältere Versionen) haben Sie Zugriff auf eine Eigenschaft innerhalb der Initialisierung von jedem Modul namens kodein, die Sie in Ihren Bindungen verwenden können.

Innerhalb Ihres Moduls, aussehen würde die Bindung:

bind<SomeService>() with singleton { SomeService(kodein) } 

Ein vollständiges Beispiel und mit einer Trennung von Schnittstellen vs. Implementierung, könnte es etwa so aussehen:

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() 
    // ... 
} 

Sie können das Modul wie angegeben vom übergeordneten Element importieren und es erhält einen eigenen Verweis auf die aktuelle Kodein-Instanz.

val kodein = Kodein { 
    import(DefaultSomeService.module) 
}