【问题标题】:How to pass an implicit value to an instance thats retrieved by guice如何将隐式值传递给由 guice 检索的实例
【发布时间】:2016-09-04 07:14:42
【问题描述】:

考虑以下类:

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

以及获取此类的代码:

app.injector.instanceOf[MyClass]

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

我该怎么做。

谢谢。

【问题讨论】:

  • 我认为你混淆了两个独立的东西:依赖注入(通过 guice - 在 Play 中)和隐式参数。在这种特定情况下,您在声明具有一个隐式参数的类时注入ws。见playframework.com/documentation/2.5.x/…
  • 好的,我如何将值传递给该类的隐式参数
  • 您可能想了解更多关于 Scala 隐式参数的信息。这是一个链接(但你可以找到很多)daily-scala.blogspot.it/2010/04/implicit-parameters.html
  • 我想这里的东西比我们看到的要多。似乎 Play 为任何注入 guice 的实例提供了一个隐式的 ExecutionContext,尽管我仍然找不到这种行为在哪里实现或记录。

标签: scala playframework playframework-2.0 guice


【解决方案1】:

您可以使用注释 @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。您还可以定义自己的注解或创建一个 Module 来绑定 MyClass 类的实现(然后最好将其设为 trait 并在不同的类中实现它)。此处唯一特定于 Play 的事情是,如果您定义了一个模块,则需要在配置中启用模块。

【讨论】:

    猜你喜欢
    • 2020-12-05
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    相关资源
    最近更新 更多