如何使用guice

时间:2016-09-29 03:51:48

标签: scala playframework dependency-injection akka guice

我使用Play Framework,Akka和Guice。需要简单地将一些服务(或另一个actor)注入一个由注入某个控制器的路由器创建的actor。

我有一个路由器配置:

akka.actor.deployment {
  /job-router {
    router = "round-robin-pool"
    nr-of-instances = 10
  }
}

绑定此路由器的模块

class ComponentModule extends AbstractModule with AkkaGuiceSupport {

  def configure() ={
    bindActor[JobActor]("job-router",(p: Props) => FromConfig.props(JobActor.props))
  }
}

演员,注入另一个路由器

class JobActor @Inject() (@Named("b-router")bRouter: ActorRef)  extends Actor {
  def this() = {
    this(null)
  }
  override def receive = {
    case SayHello(name: String) => {
      println(bRouter)
      sender() ! "hello,"+name
    }
  }
}

object JobActor {
  def props = Props[JobActor].withDispatcher("akka.actor.default-dispatcher")
}

但是不是注入b-router,而是调用没有参数的构造函数,所以我不能简单地将b-router加入到RoundRobinPool的routee中。

我明白儿童演员(比如说Actor[akka://application/user/job-router/$a#-22311049])并不是由Guice直接注入的,只是想知道是否有简化的方式来做这件事。

由于实际的routee job-router/$a#-22311049是RoundRobinPool的孩子,我是实施RoundRobinPool注入并将其传递给routee的最佳做法吗?

更新

这可以用来注射演员:

context.actorSelection("akka://application/user/b-router")

关于Guice注入的其他服务?

更新2:

暂时解决,注入另一个"顶级"演员(dao-provider-actor):

lazy val dao=Await.result((context.actorSelection("/user/dao-provider-actor") ? GetXDao).mapTo[XDAO],10.milliseconds)

0 个答案:

没有答案