Scala ';模糊的隐式值';将两名演员注入游戏控制器时
我想通过DI将两个演员注入到一个游戏控制器中。注入一个演员的作品绝对好,我可以发送信息给这个演员没有任何问题。但是,在注入第二个参与者并发送消息时,我得到以下编译错误: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
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之类的东西,则最好将它们隐式化