我希望能够创建同一父actor的多个实例,但具有不同的子actor . 我认为这对Guice来说是可能的,但我还没有找到解决方案 .
这就是我的想法〜
Controller:
class Application @Inject()(@Named(ParentActor.parentActor1) parentActor1: ActorRef,
@Named(ParentActor.parentActor2) parentActor2: ActorRef)
extends Controller {
def index = Action {
parentActor1 ! "Message"
parentActor2 ! "Message"
Ok()
}
}
Parent Actor:
object ParentActor {
final val parentActor1 = "parentActor1"
final val parentActor2 = "parentActor2"
}
class ParentActor @Inject() (childActor: ActorRef) extends Actor {
def receive = {
case "Message" =>
println(s"ParentActor ${self.path} received message...")
childActor ! "Message"
}
}
Child Actor A:
class ChildActorA extends Actor {
def receive = {
case "Message" =>
println("ChildActorA received message...")
}
}
Child Actor B:
class ChildActorB extends Actor {
def receive = {
case "Message" =>
println("ChildActorB received message...")
}
}
Module:
class Modules extends AbstractModule with AkkaGuiceSupport {
override def configure() = {
bindActor[ParentActor](ParentActor.parentActor1)
bindActor[ParentActor](ParentActor.parentActor2)
}
}
如果我希望“parentActor1”将其“childActor”引用指向ChildActorA的实例,并将“parentActor2”指向其“childActor”ref指向ChildActorB的实例,该怎么办?这可能与Guice一起实现吗?
1 回答
我正在使用一些基于https://github.com/rocketraman/activator-akka-scala-guice的代码来完成类似的事情
我没有使用Play,所以我必须初始化Guice并引导actor系统
要初始化Guice,有两个类/对象:
一个用于初始化扩展并在需要时注入actor系统
另一个为孩子们创建提供者
扩展名
制片人
和你的演员
来自sbt的输出
你必须明确地命名孩子,
这不是最纯粹或最优雅的答案,我确信代码可以优化,但它允许您创建具有不同子代的同一父代的实例 .
我在想你也可以使用BindingAnnotations