我的Play应用程序中有一个Akka Actor,它使用现已弃用的方法访问Play的配置。
class MyActor (supervisor: ActorRef) extends Actor {
val loc = Play.current.configuration.getString("my.location").get
def receive = { case _ => }
}
如果我这样做:
import javax.inject._
class MyActor @Inject(configuration: play.api.Configuration) (supervisor: ActorRef) extends Actor {
我的班级不会编译并且编译器返回:"类文件注释参数必须作为命名参数提供"
我假设您只能在控制器类中进行DI配置。那么,是否可以在Play应用程序中从Akka Actore中访问配置?我可以在构造期间将配置传递给actor,或者只为actor提供一个单独的配置文件,但两者看起来都非常hacky。是否有使用Play api的首选方法?
谢谢!
答案 0 :(得分:2)
上面的mana答案指出了在Play中与演员结合使用DI的最优雅方式,但在任何演员中都可以找到如下配置:
context.system.settings.config
答案 1 :(得分:1)
这在我的项目中有效:
Module.scala
:
class ExampleModule extends AbstractModule with AkkaGuiceSupport {
override def configure(): Unit = {
bindActor[ExampleActor]("example-actor-name")
}
}
Actor.scala
:
object ExampleActor {
def props = Props[ExampleActor]
}
@Singleton
class ExampleActor @Inject()(/*some DI*/) extends Actor {
...
}
然后你甚至可以通过 DI 将这个演员注入其他类(@Named()
是可选的,如果你只配置了一个Actor
):
SomeOtherClass.scala
@Singleton
class SomeOtherClass @Inject()(@Named("example-actor-name") exampleActor: ActorRef) {
...
}