尝试实例化命名(注释)类
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 也应该有效。
首先,感谢您为尝试回答问题所做的努力。 从当前的应用程序注入器 (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 也应该有效。