2017-07-17 29 views
0

我想通過DI將兩個演員注入到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

您將兩個參與者定義爲隱式參數。更改簽名,如下所示:

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

我試圖從提供程序注入actorRef到控制器中。

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

相關問題