【问题标题】:With Kodein dependency injection, I don't want to pass around kodein instances everywhere使用 Kodein 依赖注入,我不想到处传递 kodein 实例
【发布时间】:2016-11-29 02:42:25
【问题描述】:

使用 Kodein,我发现我必须传递 kodein 实例或将它们注入到模块和类中。但有时我的课程如此脱节,我希望他们能够发现“一个真正的 Kodein”。由于这是一个服务器端应用程序,而且我只有一个 Kodein 范围,所以应该很容易。我可以创建一个全局对象,比如:

val kodeinGlobal: Kodein = Kodein { ... }

但是当某些模块在不同的项目中重复使用并且我们不能轻易共享这个实例时,这不起作用。也许一个单独的模块只是为了保存全局会起作用,但它需要是一个var,我不希望它是可变的。

Kodein 能否自行查找主范围、顶级范围或全局范围?

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

【问题讨论】:

    标签: dependency-injection kotlin kodein


    【解决方案1】:

    在 Kodein 3.x 中,有一个名为 kodein-conf 的新模块可用。这允许您创建一个可修改的 Kodein 实例(只要您在第一次注入完成之前对其进行修改),如果需要,它还包含一个用于共享使用的 Kodein 全局实例。这与普通的 Kodein 实例相反,后者必须在构建时定义所有绑定并且永远不能修改。

    使用预定义的全局就像引用Kodein.global 一样简单。它和任何可配置的 Kodein 实例一样工作:

    Kodein.global.addImport(someModule) // add other modules to it
    
    val something: SomethingCool = Kodein.global.instance() // inject from it
    

    如果你想让自己的全球化:

    val kodeinGlobal = ConfigurableKodein()
    

    有关ConfigurableKodein 的更多信息,请阅读Kodein 3.x docs for ConfigurableKodein,以及预定义的全局实例The God Complex: One True Kodein

    作为助手,您可以使用新的KodeinGlobalAware 接口在您的类中自然访问 Kodein 实例,而无需直接引用全局 Kodein 实例。比如添加这个接口,就可以调用实例创建方法,如:

    class DefaultSomeService(): SomeService, KodeinGlobalAware {
        val mapper: ObjectMapper = instance()
        // ...
    }
    

    或者,如果您有一个案例(例如测试)想要使用全局实例,除非被特定实例覆盖,您可以执行类似的操作:

    class DefaultSomeService(override val kodein: Kodein = Kodein.global): SomeService, KodeinAware {
        val mapper: ObjectMapper = instance()
        // ...
    }
    

    它使用KodeinAware 接口并覆盖其抽象成员变量kodein 在类中执行相同的透明类型注入,同时默认为global 实例。

    如果您只想注入 Kodein,无论是全局实例还是特定实例,请参阅:Injecting Kodein instances within binding declarations 作为替代方案。

    【讨论】:

      猜你喜欢
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      相关资源
      最近更新 更多