我有一个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
对象中构建(请参阅play-subcut on github) .
为了覆盖actor的实例化以传递绑定模块,我将用什么替换 Akka.system.actorOf(Props[FoobarActor])
?
object Foobar {
val actor = /* what goes here? */
}
1 回答
正如Roland所说,这应该就像使用构造函数参数实例化actor一样简单 . 我不确定隐含的是否可以使用Akka用构造函数args进行actor实例化的方式,但它似乎工作正常 . 代码看起来应该是这样的:
然后,如果你想实例化
FoobarActor
,只要你在范围内有一个隐含的BindingModule
,你就可以这样做: