尝试实例化命名(注释)类

Trying to instantiate named(annotated) classes

首先,感谢您为尝试回答问题所做的努力。 从当前的应用程序注入器 (play.api.Play.current.injector),我如何获得 class 的命名实例? 我尝试将注入器转换为 ScalaInjector (net.codingwell.scalaguice.InjectorExtensions.ScalaInjector) 和 Guice Injector (com.google.inject.Injector),均未成功。 问题是实例化一个class的方法只有3个,都是重载了instanceOf[T]

对于正常的依赖你会做

play.api.Play.current.injector.instanceOf[ProjectRepo]

当你想检索命名依赖时,你可以这样做

val qualifier = Some(QualifierInstance(Names.named("name")))
val bindingKey = BindingKey[ProjectRepo](Class[ProjectRepo], qualifier)

play.api.Play.current.injector.instanceOf[ProjectRepo](bindingKey)

无论如何,你应该只在极少数情况下直接使用注入器,确保没有更简单的方法来检索你的依赖项。

当你需要注入命名依赖项(在我的例子中是 ActorRef)时,你也可以使用 case class 来帮助:

case class NamedActorHelper @Inject() (@Named("some-actor") actor: ActorRef)

class SomeActorSpec with GuiceOneAppPerSuite {
  ...
  val someActor = app.injector.instanceOf[NamedActorHelper].actor
  ...
}

app 替换为 play.api.Play.current 也应该有效。