使用 Subcut 在 Play 应用程序中实例化 Akka actor



我有一个Play 2.1应用程序。 我还使用 Subcut 进行依赖注入,它已经设置并适用于应用程序的大部分部分,除了一个。

假设我有以下与演员相关的代码片段:

import akka.actor._
import com.typesafe.plugin._
import play.api.Play.current
import play.api.libs.concurrent.Akka
class FoobarActor extends Actor {
   def receive = {
     // do stuff here
   }
}
object Foobar {
  val actor = Akka.system.actorOf(Props[FoobarActor])
}

现在,假设我想使用 Subcut 将一些对象注入到FoobarActor的每个实例中。 这将需要 actor 类扩展 Injectable ,并将BindingModule传递到构造函数中,如下所示:

import akka.actor._
import com.typesafe.plugin._
import play.api.Play.current
import play.api.libs.concurrent.Akka
import com.escalatesoft.subcut.inject.{Injectable, BindingModule}
class FoobarActor(implicit val bindingModule: BindingModule) extends Actor 
  with Injectable {
   val bazProvider = inject[BazProvider]
   val quuxProvider = inject[QuuxProvider]
   def receive = {
      // do stuff here  
   }
}

问题是:这样的演员是如何实例化的?

通常,Subcut 管理的对象是在 Subcut 的配置对象(即扩展NewBindingModule的对象)中构造的,或者在 Play 的控制器的情况下,是在 Global 对象中构造的(请参阅 github 上的 play-subcut)。

我将用什么替换Akka.system.actorOf(Props[FoobarActor])以覆盖参与者的实例化以传入绑定模块?

object Foobar {
  val actor = /* what goes here? */   
}

正如 Roland 所提到的,这应该像使用构造函数参数实例化 actor 一样简单。 我不确定隐式是否适用于 Akka 使用构造函数参数进行参与者实例化的方式,但它似乎工作正常。 代码应如下所示:

class FoobarActor(implicit val bindingModule: BindingModule) extends Actor 
  with Injectable {
   val bazProvider = inject[BazProvider]
   val quuxProvider = inject[QuuxProvider]
   def receive = {
      // do stuff here  
   }
}
object FoobarActor {
  def apply(implicit bindingModule:BindingModule) = {
    Akka.system.actorOf(Props(classOf[FoobarActor], bindingModule))
  }
}

然后,如果你想实例化FoobarActor,只要你在作用域中有一个隐式BindingModule,你可以做:

val ref = FoobarActor()

最新更新