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

时间:2013-09-28 17:35:24

标签: scala dependency-injection playframework akka subcut

我有一个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对象中构建(请参阅{{3} })。

为了覆盖actor的实例化以传递绑定模块,我将用Akka.system.actorOf(Props[FoobarActor])替换什么?

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

1 个答案:

答案 0 :(得分:2)

正如Roland所说,这应该就像使用构造函数参数实例化actor一样简单。我不确定隐含的是否可以使用Akka用构造函数args进行actor实例化的方式,但它似乎工作正常。代码看起来像这样:

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()