2013-09-28 5 views
1

Play 2.1 애플리케이션이 있습니다. 또한 종속성 주입을 위해 Subcut을 사용하고 있습니다.이 Subcut은 이미 설정되어 있고 응용 프로그램의 대부분의 부분에서 작동합니다 (단 하나만 제외). 지금Subcut으로 Play 애플리케이션에서 Akka 액터를 인스턴스화하기

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의 각 인스턴스에 일부 개체를 삽입하고 싶은 말 :

내가 배우 관련 코드의 다음 코드를 말한다. 문제는

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

입니다 : : 어떻게 그런 배우가 인스턴스화이 같은 생성자에 전달 된 BindingModuleInjectable을 확장하는 액터 클래스를, 필요? 일반적 Subcut 의해 관리 객체

는 Subcut의 구성 객체 (즉, NewBindingModule 연장 개체), 또는 재생의 컨트롤러의 경우, Global 객체 (play-subcut on github 참조)로 구성된다.

바인딩 모듈을 전달하기 위해 액터의 인스턴스를 무시하기 위해 무엇을 Akka.system.actorOf(Props[FoobarActor])으로 대체합니까?

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

이미나요 DI에서 Akka 의사를 살펴 보시겠습니까? http://doc.akka.io/docs/akka/2.2.1/scala/actors.html#dependency-injection –

+0

나는 서브 컷에 대해 모른다. 그러나 생성자로'BindingModule'을 제공하는 것만 큼 간단 할 수도있다. 논의. –

답변

2

Roland가 언급했듯이 이것은 생성자 인수로 액터를 인스턴스화하는 것처럼 간단해야합니다. 암시 적으로 생성자 args를 사용하여 액터 인스턴스화를 수행하는 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() 
+0

이것은 동일한 로컬 AkkaSystem에서만 생성되는 액터와 함께 작동하는 것으로 보입니다. BindingModule은 100 % 직렬화 가능하지 않고 원격 생성을 위해 변경할 수 없습니다. –

관련 문제