依赖注入模块初始化顺序中Dev和Prod模式之间的差异

问题描述 投票:0回答:1

我有一个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在开发模式下运行时效果很好,但是在生产模式下,调用Global.Injector = builder.injector()导致循环依赖,因为它调用需要初始化Global.Injector的模块和绑定,但此时尚未初始化。

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

  1. 我理解正确吗?
  2. 我的方法有效吗?如何在生产模式下解决问题?
scala dependency-injection playframework guice
1个回答
0
投票

我正在尝试在全球范围内保留对Play注射器的引用

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

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

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

此方法应该没有任何问题。

© www.soinside.com 2019 - 2024. All rights reserved.