如何在 AbstractModule 中注入执行上下文?



我正在使用游戏框架,我正在尝试在 AbstractModule 中注入执行上下文:

import com.google.inject.{AbstractModule, Provider}

import com.google.inject.{AbstractModule, Provider}
import javax.inject.Inject
class MyModule @Inject() (environment: Environment, config: Configuration)(implicit ec: ExecutionContext) extends AbstractModule {
override def configure(): Unit = {
// ..
}
}

我收到运行时错误:

没有有效的构造函数模块 [...无法构造我的模块

这工作正常,但我正在使用我不想引用的全局引用 ExecutionContext(实际上,一旦我开始工作,我需要引用一个命名的 EC)

import com.google.inject.{AbstractModule, Provider}
import javax.inject.Inject
import scala.concurrent.ExecutionContext.Implicits.global

class MyModule @Inject() (environment: Environment, config: Configuration) extends AbstractModule {
override def configure(): Unit = {
// ..
}
}

Nerco'ing 一个旧帖子以供将来参考。

现在,我确信我下面的帖子充满了错误和误解,所以请对此持保留态度。

至于第二个例子:

import com.google.inject.{AbstractModule, Provider}
import javax.inject.Inject
import scala.concurrent.ExecutionContext.Implicits.global
class MyModule @Inject() (environment: Environment, config: Configuration) extends AbstractModule {
override def configure(): Unit = {
// ..
}
}

一般来说,在这里的 Play 上下文中,使用scala.concurrent.ExecutionContext.Implicits.global是一种反模式(忽略您甚至不想首先使用全局执行上下文的事实),尤其是在 Play 框架提供通用上下文时。我通常只在测试期间使用scala.concurrent.ExecutionContext.Implicits.global,除非我出于某种原因需要不同的。

至于第一个例子和最初的问题:

import com.google.inject.{AbstractModule, Provider}
import javax.inject.Inject
class MyModule @Inject() (environment: Environment, config: Configuration)(implicit ec: ExecutionContext) extends AbstractModule {
override def configure(): Unit = {
// ..
}
}

如您所知,这是行不通的,也没有任何方法(据我所知)可以使其按您想要的方式工作。原因是,

  1. 没有构造函数实际上与class MyModule @Inject() (environment: Environment, config: Configuration)(implicit ec: ExecutionContext)的签名匹配
  2. 据我了解(这不太可能是错误的),在应用程序生命周期的这个时间点,还没有为依赖注入进行实际的绑定(除了那些用于environmentconfiguration的绑定,它们是特殊情况)。

尝试这样看:此时,Guice(默认情况下用于 Play 中的依赖注入)正在聚合绑定列表以创建依赖关系图。这个依赖关系图用于确定必须存在哪些对象实例才能创建其他对象实例(我需要创建 A,但 A 需要 B 和 C,C 需要 D,所以我必须在 C 之前做 D,然后做 C 和 B 在 A 之前)。

您本质上要求 Play 和 Guice 做的是使用不存在的构造函数创建一个类的实例,并将组件注入其中,它正在弄清楚如何创建。

最新更新