Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用Subcut在戏剧应用程序中实例化Akka演员_Scala_Dependency Injection_Playframework_Akka_Subcut - Fatal编程技术网

Scala 使用Subcut在戏剧应用程序中实例化Akka演员

Scala 使用Subcut在戏剧应用程序中实例化Akka演员,scala,dependency-injection,playframework,akka,subcut,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 =

我有一个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类扩展
可注入的
,并将
绑定模块
传递到构造函数中,如下所示:

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  
   }
}
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))
  }
}
问题是:这样的参与者是如何实例化的

通常,Subcut管理的对象在Subcut的配置对象(即扩展
NewBindingModule
的对象)中构造,或者在播放控制器的情况下,在
Global
对象中构造(请参阅)

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

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

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

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

你已经看过阿卡医生在DI上了吗?我不知道subcut,但它可能像提供构造函数参数那样提供一个
BindingModule
一样简单。这似乎只适用于在同一本地AkkaSystem中创建的参与者。BindingModule很可能不是100%可序列化和不可变的,因此不允许远程创建。