1

Play 2.1 アプリケーションがあります。また、Subcut を依存性注入に使用しています。これは、1 つを除いて、アプリケーションのほとんどの部分で既にセットアップされ、機能しています。

アクター関連のコードの次のスニペットがあるとします。

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

ここで、サブカットを使用する各インスタンスにいくつかのオブジェクトを挿入したいとします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  
   }
}

問題は、そのようなアクターをどのようにインスタンス化するかです。

通常、Subcut によって管理されるオブジェクトは、Subcut の構成オブジェクト (つまり、 を拡張するオブジェクトNewBindingModule) 内に構築されるか、Play のコントローラーの場合はオブジェクト内に構築されます ( github の play-subcut をGlobal参照)。

Akka.system.actorOf(Props[FoobarActor])バインディング モジュールを渡すためにアクターのインスタンス化をオーバーライドするには、 何を置き換えますか?

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

1 に答える 1

2

Roland が述べたように、これはコンストラクタ引数でアクターをインスタンス化するのと同じくらい簡単なはずです。コンストラクター引数を使用してアクターのインスタンス化を行う 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()
于 2013-09-29T11:35:20.617 に答える