从Akka Actor

时间:2016-07-14 17:58:04

标签: scala akka playframework-2.5

我的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的首选方法?

谢谢!

2 个答案:

答案 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) {
    ...
}