Actor中的WebSocket.acceptWithActor和@Inject()(Play 2.5)

ide*_*xer 9 dependency-injection guice akka playframework playframework-2.5

WebSocket.acceptWithActor 在不使用Guice的情况下实例化一个新的Akka演员.

使用Play 2.4,仍然可以通过导入为我的演员使用注入器play.api.Play.current.

来自ReactiveMongo文档的片段:

import scala.concurrent.Future

import play.api.Play.current // should be deprecated in favor of DI
import play.api.libs.concurrent.Execution.Implicits.defaultContext

import play.modules.reactivemongo.ReactiveMongoApi
import play.modules.reactivemongo.json.collection.JSONCollection

object Foo {
  lazy val reactiveMongoApi = current.injector.instanceOf[ReactiveMongoApi]

  def collection(name: String): Future[JSONCollection] =
    reactiveMongoApi.database.map(_.collection[JSONCollection](name))
}
Run Code Online (Sandbox Code Playgroud)

但在Play 2.5中,play.api.Play.current已弃用.我怎么还能注入ReactiveMongoApi我的演员?ReactiveMongoApi在我的演员中使用实例的推荐方法是什么?

这里是我的代码与播放2.4,因为我的自定义角色类作品ClientActor必须获得ReactiveMongoApi通过current.injector.instanceOf[ReactiveMongoApi]:

@Singleton
class Application @Inject() (system: ActorSystem) extends Controller {

  val midiDiscoveryActor = system.actorOf(MidiDiscoveryActor.props, "midi-discovery-actor")
  val midiActor = system.actorOf(MidiActor.props(midiDiscoveryActor), "midi-actor")

  def index(page: String) = Action {
    Ok(views.html.index(page))
  }

  def bidirectional = WebSocket.acceptWithActor[JsValue, JsValue] { request => out =>
    ClientActor.props(out, midiActor, midiDiscoveryActor)
  }

}
Run Code Online (Sandbox Code Playgroud)

ret*_*hab 3

我认为这是不可能的。引用詹姆斯·罗珀的话:

Play 为依赖注入参与者提供的帮助器适用于有限数量的用例。不过,助手实际上只是一些常见需求的非常薄的包装 - 根本不需要它们。在 Play 的 WebSocket actor 支持的情况下,问题是,通常您希望手动实例化 actor,因为您必须以某种方式将其传递给 ActorRef。因此,您可以使用 Guice 辅助注入来完成此操作,并定义一个因子接口来获取演员引用(以及您想要传递给它的任何其他参数),或者简单地手动实例化它,将依赖项从控制器传递给演员, 例如:

class MyController @Inject() (myDep: MyDep) extends Controller {
  def socket = WebSocket.acceptWithActor[String, String] { request => out =>
    MyWebSocketActor.props(out, myDep)
  }
}
Run Code Online (Sandbox Code Playgroud)