【问题标题】:Instantiating Akka actors in a Play application with Subcut使用 Subcut 在 Play 应用程序中实例化 Akka Actor
【发布时间】:2013-09-28 17:35:24
【问题描述】:

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

假设我有以下与actor相关的sn-p代码:

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 的每个实例中。这将要求演员类扩展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  
   }
}

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

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

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

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

【问题讨论】:

  • 你已经看过 DI 上的 Akka 文档了吗? doc.akka.io/docs/akka/2.2.1/scala/…
  • 我不知道 subcut,但它可能就像提供 BindingModule 作为构造函数参数一样简单。

标签: scala dependency-injection playframework akka subcut


【解决方案1】:

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

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

【讨论】:

  • 这似乎只适用于在同一个本地 AkkaSystem 中创建的演员。 BindingModule 很可能不是 100% 可序列化和不可变的以允许远程创建。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 2016-07-18
  • 2014-09-29
  • 1970-01-01
  • 2023-03-31
  • 2016-02-26
  • 1970-01-01
相关资源
最近更新 更多