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

Gle*_*eeb 3 scala guice playframework playframework-2.0

考虑以下课程:

class MyClass @Inject() (ws: WSClient)(implicit executionContext: ExecutionContext)
Run Code Online (Sandbox Code Playgroud)

以及获取此类的代码:

app.injector.instanceOf[MyClass]
Run Code Online (Sandbox Code Playgroud)

从我理解的guice注入器,注入一个ExecutionContext隐含的ExecutionContext,但在某些情况下,我想给该实例一个不同的ExecutionContext

我该怎么做呢

谢谢.

yah*_*hor 5

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

class MyClass @Inject() (ws: WSClient)
                        (implicit @Named("myEC") executionContext: ExecutionContext)
Run Code Online (Sandbox Code Playgroud)

绑定:

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)
  }
}
Run Code Online (Sandbox Code Playgroud)

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

play.modules.enabled += "my.modules.MyExecutionContextModule"
Run Code Online (Sandbox Code Playgroud)

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