【发布时间】:2017-03-22 14:45:03
【问题描述】:
我对播放文档https://www.playframework.com/documentation/2.5.x/ScalaAkka有点困惑
查看示例,可以从控制器启动一个actor:
import play.api.mvc._
import akka.actor._
import javax.inject._
@Singleton
class Application @Inject() (system: ActorSystem) extends Controller {
val actor = system.actorOf(Props(classOf[AnActor], "anActor")
//...
}
或者可以依靠 Guice 来实例化那个演员
import com.google.inject.AbstractModule
import play.api.libs.concurrent.AkkaGuiceSupport
import actors.ConfiguredActor
class MyModule extends AbstractModule with AkkaGuiceSupport {
def configure = {
bindActor[AnActor]("anActor")
}
}
当演员被Guice实例化时,可以向其中注入依赖
import akka.actor._
import javax.inject._
import play.api.Configuration
class AnActor @Inject() (configuration: Configuration) extends Actor {
//...
}
但是,从控制器启动该演员会引发
[IllegalArgumentException: no matching constructor found on class AnActor for arguments []]
有没有办法将服务注入到非 Guice 实例化的 Actor 中?
【问题讨论】:
-
能否将
Configuration注入Application,然后作为参数提供?然后,演员创作将变成类似val actor = system.actorOf(Props(new AnActor(configuration)), "anActor") -
是的,这就是我目前所做的。然而,这似乎不是很优雅。此外,我的最终目标是将服务注入到子actor中,我希望避免将它们作为参数从构造函数传递给构造函数。
-
我明白了。我不确定这是否可行,但AssistedInject 可能会有所帮助。
标签: scala dependency-injection playframework akka