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