2017-07-17 19 views
0

DI経由で2つのアクタをPlayコントローラに注入したいとします。 1人の俳優を注入することは、まったく問題なく動作し、問題なくこの俳優にメッセージを送ることができます。第二の俳優を注入して、メッセージを送信するときしかし、私は、次のコンパイルエラーが表示されます。2つのアクタをPlayコントローラに注入するときに「あいまいな暗黙の値」

play.sbt.PlayExceptions$CompilationException: Compilation error[ambiguous implicit values: 
both value fooSupervisor in class MyController of type akka.actor.ActorRef 
and value barSupervisor in class MyController of type akka.actor.ActorRef 
match expected type akka.actor.ActorRef] 

私のコントローラは、次のようになります。

class MyController @Inject()(
              implicit system: ActorSystem, 
              materializer: Materializer, 
              @Named("FooSupervisor") fooSupervisor: ActorRef, 
              @Named("BarSupervisor") barSupervisor: ActorRef 
             ) extends Controller { 


} 

、次のようにモジュールが見えます:

class Module extends AbstractModule with ScalaModule with AkkaGuiceSupport { 

    def configure() { 
    // .... 
    bindActor[FooSupervisor]("FooSupervisor") 
    bindActor[BarSupervisor]("BarSupervisor") 
    () 
    } 

} 

どうすればこの問題を解決できますか?

答えて

2

暗黙のパラメータとして2つのアクタを定義します。シグネチャを次のように変更してください:

0

私は、プロバイダからアクタレコードをコントローラに注入しようとしました。

import javax.inject._ 
import akka.actor.ActorRef 
import play.api.mvc._ 

@Singleton 
class HomeController @Inject()(@Named("actor1") val actor1: ActorRef, @Named("actor2") val actor2: ActorRef) extends Controller { 
    def index = Action { 
    actor1 ! "hello actor1" 
    actor2 ! "hello actor2" 
    Ok("Hello") 
    } 
} 

モジュールはactorRefをバインドする必要があります。

import javax.inject.{Inject, Provider} 
import com.google.inject.AbstractModule 
import net.codingwell.scalaguice.ScalaModule 
import actors.{Actor1, Actor2} 
import akka.actor.{ActorRef, ActorSystem, Props} 

class Module extends AbstractModule with ScalaModule{ 
    override def configure() = { 
    bind[ActorRef].annotatedWithName("actor1").toProvider[Actor1Provider] 
    bind[ActorRef].annotatedWithName("actor2").toProvider[Actor2Provider] 
    } 
} 

class Actor1Provider @Inject() (system: ActorSystem) extends Provider[ActorRef]{ 
    override def get(): ActorRef = system.actorOf(Props[Actor1]) 
} 

class Actor2Provider @Inject() (system: ActorSystem) extends Provider[ActorRef]{ 
    override def get(): ActorRef = system.actorOf(Props[Actor2]) 
} 

マテリアライザーとactorSystemが必要な場合は、暗黙のパラメーターとして渡してください。 actorRef自体を注入したので、アクターとやりとりするactorSystemは必要ありません。しかし、コントローラーの中で何をするかによって、マテリアライザーやアクターのようなものが必要な場合は、暗黙的にシステムを作成する方が良いでしょう。

+0

fyi - guice 4.1.0を使用して上記のコードをテストしました。 – Prashanth

関連する問題