Scala ';模糊的隐式值';将两名演员注入游戏控制器时

Scala ';模糊的隐式值';将两名演员注入游戏控制器时,scala,dependency-injection,playframework,akka,guice,Scala,Dependency Injection,Playframework,Akka,Guice,我想通过DI将两个演员注入到一个游戏控制器中。注入一个演员的作品绝对好,我可以发送信息给这个演员没有任何问题。但是,在注入第二个参与者并发送消息时,我得到以下编译错误: play.sbt.PlayExceptions$CompilationException: Compilation error[ambiguous implicit values: both value fooSupervisor in class MyController of type akka.actor.ActorRe

我想通过DI将两个演员注入到一个游戏控制器中。注入一个演员的作品绝对好,我可以发送信息给这个演员没有任何问题。但是,在注入第二个参与者并发送消息时,我得到以下编译错误:

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

}

如何解决此问题?

将两个参与者定义为隐式参数。更改签名,如下所示:

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

我尝试从提供程序将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])
}
如果您需要materializer和actorSystem,请将它们作为隐式参数传递。由于我们已经注入了actorRef本身,我们可能不需要actorSystem来与参与者交互。但这取决于您在控制器内执行的其他操作——如果您需要materializer或actorSystem之类的东西,则最好将它们隐式化