【问题标题】:Difference between Dev & Prod modes in dependency injection modules initialization order依赖注入模块初始化顺序中 Dev 和 Prod 模式的区别
【发布时间】:2019-11-07 19:10:34
【问题描述】:

我有一个 Play 应用程序,我正在使用用于 DI 的 Play 库,Guice 开箱即用。

我定义的一些播放模块相互依赖,为了让它们能够将一个绑定注入另一个,我试图在全局位置保留对 Play 注入器的引用,即

class MyApplicationLoader extends GuiceApplicationLoader() {
  override def builder(context: ApplicationLoader.Context): 
    GuiceApplicationBuilder = {
    val builder = super.builder(context)
    Global.Injector = builder.injector()
    builder
  }
}

这在 Play 在 Dev 模式下运行时效果很好,但在 Production 模式下,调用 Global.Injector = builder.injector() 会导致循环依赖,因为它调用需要初始化 Global.Injector 的模块和绑定,但此时尚未初始化点。

我知道这可能与以下事实有关:在开发模式下,渴望单例首先初始化,而在生产模式中,渴望单例和常规单例一起初始化。

  1. 我理解对了吗?
  2. 我的方法有效吗?如何在生产模式下解决此问题?

【问题讨论】:

    标签: scala dependency-injection playframework guice


    【解决方案1】:

    我正在尝试在全局位置保留对 Play 注入器的引用

    这在大多数情况下应该是不必要的,你应该尽量避免它。

    为了解决你的问题,看起来你只需要使用Provides注解,一个简单的例子是这样的:

    class MyModule extends AbstractModule {
      @Provides
      def complexConstructor(a: ObjA, b: ObjB): ComplexClass = ???
    }
    

    这种方法应该没有任何问题。

    【讨论】:

    • 您的方法解决了我遇到的问题。不过,我仍然想引用注入器,因为我想避免更改大量代码。因此,我使用了您的 @Provides 方法和 com.google.inject.Injector 作为该方法的注入参数。不同之处可能是我确保没有模块引用注入器,而只有来自模块外部的代码。
    猜你喜欢
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2019-01-11
    相关资源
    最近更新 更多