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)
我认为这是不可能的。引用詹姆斯·罗珀的话:
Play 为依赖注入参与者提供的帮助器适用于有限数量的用例。不过,助手实际上只是一些常见需求的非常薄的包装 - 根本不需要它们。在 Play 的 WebSocket actor 支持的情况下,问题是,通常您希望手动实例化 actor,因为您必须以某种方式将其传递给 ActorRef。因此,您可以使用 Guice 辅助注入来完成此操作,并定义一个因子接口来获取演员引用(以及您想要传递给它的任何其他参数),或者简单地手动实例化它,将依赖项从控制器传递给演员, 例如:
Run Code Online (Sandbox Code Playgroud)class MyController @Inject() (myDep: MyDep) extends Controller { def socket = WebSocket.acceptWithActor[String, String] { request => out => MyWebSocketActor.props(out, myDep) } }