在游戏2.5中使用guice注入Akka演员

时间:2018-06-26 08:52:37

标签: java scala playframework akka guice

在Play 2.2中,我创建了GlobalActorProducer类

"assets": [
  "src/favicon.ico",
  "src/assets",
  {
    "glob": "**/*",
    "input": "./node_modules/<your-node-module>/<possibly-subfolders>",
    "output": "./assets/<possibly-subfolders>"
  },

我想将play框架升级到2.5。 Play.current在播放2.5中已弃用,因此我通过使用Injector修改了此类,但注射器始终为Null。我需要如何使此类在Play 2.5上正常工作?

import akka.actor.{Props, IndirectActorProducer, Actor}
import play.api.Play

class GlobalActorProducer[T <: Actor](val aClass: Class[T]) extends IndirectActorProducer {

  def produce(): T = Play.current.global.getControllerInstance(aClass)

  def actorClass: Class[T] = aClass
}

object GlobalActorProducer {
  def apply[T <: Actor](targetClass: Class[T]): Props = Props.create(classOf[GlobalActorProducer[T]], targetClass)
}

2 个答案:

答案 0 :(得分:0)

注入Actor是一个坏习惯。 ActorRef是由actor系统以特殊方式创建的,没有公开实际对象而是公开了ActorRef(句柄)。

解决方案:

想法是注入ActorSystem,然后使用创建角色

actorSystem.actorOf

答案 1 :(得分:0)

您要利用Play在play.api.libs.concurrent.AkkaGuiceSupport命名空间中提供的Akka Guice支持,如Dependency Injecting Actors中所述。

  

Play提供了一些帮助程序来帮助提供演员绑定。这些允许actor自身进行依赖注入,并允许actor的actor ref注入其他组件。要使用这些助手来绑定角色,请按照依赖关系注入文档中的描述创建一个模块,然后混入AkkaGuiceSupport特性,并使用bindActor方法来绑定角色:

import com.google.inject.AbstractModule
import play.api.libs.concurrent.AkkaGuiceSupport

import actors.ConfiguredActor

class MyModule extends AbstractModule with AkkaGuiceSupport {
  def configure = {
    bindActor[ConfiguredActor]("configured-actor")
  }
}

@Singleton
class Application @Inject() (@Named("configured-actor") configuredActor: ActorRef, components: ControllerComponents)
                            (implicit ec: ExecutionContext) extends AbstractController(components) {

  implicit val timeout: Timeout = 5.seconds

  def getConfig = Action.async {
    (configuredActor ? GetConfig).mapTo[String].map { message =>
      Ok(message)
    }
  }
}