2016-07-25 3 views
4

Kodeinでは、モジュールを親モジュールにインポートしていますが、後で自分で注入できるように、クラスにはKodeinのインスタンスが必要なことがあります。問題は、このコードです:SomeService.moduleは後でKodeinインスタンスが必要ですが、Kodeinがまだ作成されていないKodein依存性注入では、どうやってKodeinのインスタンスをインスタンスに挿入できますか?

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

。後でモジュールに渡すのは悪い考えです。

コデインで3.xグローバルインスタンスを持つkodein-confモジュールがありますが、グローバルを避けたいと思います。

他のモジュールやクラスはどのようにKodeinインスタンスを取得しますか?

注:慣用の答えは、一般的にKotlin/Kodeinトピックは、SOに存在するよう求めするように、この質問は、意図的に、作者(Self-Answered Questions)によって書かれ、答えています。

答えて

4

コデイン3.x(さらに古いバージョン)では、バインディングで使用できる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() 
    // ... 
} 
:完全な例については

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

と実装対インタフェースの分離を使用して、それは次のようになります。

モジュールは、指定したとおりに親からモジュールをインポートすることができ、現在のKodeinインスタンスへの独自の参照を受け取ります。

val kodein = Kodein { 
    import(DefaultSomeService.module) 
} 
関連する問題