如何将隐式值传递给guice检索的实例

时间:2016-05-09 15:15:22

标签: scala playframework playframework-2.0 guice

考虑以下课程:

class MyClass @Inject() (ws: WSClient)(implicit executionContext: ExecutionContext)

以及获取此类的代码:

app.injector.instanceOf[MyClass]

根据我对guice注入器的理解,将ExecutionContext注入到隐式ExecutionContext中,但在某些情况下我想为该实例提供不同的ExecutionContext

我该怎么做。

感谢。

1 个答案:

答案 0 :(得分:5)

您可以使用注释@Named标记隐式参数,并为"命名"定义绑定。 ExecutionContext中。

class MyClass @Inject() (ws: WSClient)
                        (implicit @Named("myEC") executionContext: ExecutionContext)

绑定:

package my.modules

import scala.concurrent.ExecutionContext

import com.google.inject.AbstractModule
import com.google.inject.name.Names

class MyExecutionContextModule extends AbstractModule {
  override def configure(): Unit = {
    bind(classOf[ExecutionContext]).annotatedWith(Names.named("myEC"))
      .to(classOf[MyExecutionContextImpl])
      // .toInstance(myExecutionContext)
  }
}

然后您需要在Play配置中启用模块

play.modules.enabled += "my.modules.MyExecutionContextModule"

有关注释的详细信息,请参阅Guice docs。您还可以定义自己的注释或创建一个模块来绑定MyClass类的实现(然后最好将其作为特征并在不同的类中实现它)。这里唯一的Play特定的事情是,如果你定义了一个模块,你需要在config中启用模块。