【问题标题】:In Kodein dependency injection, how can you inject instances of Kodein itself into instances?在 Kodein 依赖注入中,如何将 Kodein 本身的实例注入到实例中?
【发布时间】:2016-11-29 02:14:27
【问题描述】:

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

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

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

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

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

注意: 此问题由作者 (Self-Answered Questions) 特意编写和回答,以便对 Kotlin/Kodein 常见问题的惯用回答存在于 SO 中。

【问题讨论】:

    标签: dependency-injection kotlin kodein


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-11-29
      • 2020-04-20
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2016-10-23
      • 2012-02-26
      • 2015-08-05
      • 1970-01-01
      相关资源
      最近更新 更多