如何构造一个演员及其包装器?

bluenote10

我正在尝试编写一个名为的演员ActorManager该演员包装了另一个名为的演员RealActor这个想法是,ActorManager可以处理所有传入和传出的消息RealActor,从而允许添加其他逻辑,例如过滤或缓冲。RealActor就像在现实世界中一样,外界应该通过其经理唯一的人进行通信

初稿看起来像这样:

class ActorManager(realActor: ActorRef) extends Actor {
  def receive = {
    case _ => { /* pre-process messages */ }
  }
}

class RealActor(actorManager: ActorRef) extends Actor {
  def receive = {
    case _ => { /* actual business logic */ }
  }
}

但是,这提出了一个问题,即如何一次构造两个参与者,或更具体地讲,在Props给定两个参与者的循环依赖关系的情况下,如何定义对应的参与者。我不确定在定义时一般lazy val模式是否适用Props

我还想避免先构建两个方法之一,再引入显式Register协议连接它们的方法。

bluenote10

通过使用actor层次结构而不是普通actor兄弟姐妹,可以更好地解决这种情况。由于此处的主要目的是RealActor将外界隐藏起来,因此将其ActorRef相应地由外部包装/拥有更为有意义ActorManager

这意味着RealActor必须在范围内创建引用ActorManager这可以通过向父级传递一个ActorRef => Props函数来实现,以创建子级actor:

// Parent
class ActorManager(getRealActorProps: ActorRef => Props) extends Actor {
  val realActor = context.actorOf(getRealActorProps(self))
  def receive = {
    case _ => { /* pre-process messages */ }
  }
}

// Child
class RealActor(actorManager: ActorRef) extends Actor {
  def receive = {
    case _ => { /* actual business logic */ }
  }
}

object RealActor {
  def propsActorManager(getRealActorProps: ActorRef => Props) = 
    Props(new ActorManager(getRealActorProps))
  def propsRealActor(actorManager: ActorRef) = 
    Props(new RealActor(actorManager))

  def props() = 
    Props(new ActorManager(actorManager => propsRealActor(actorManager)))
}

请注意,现在甚至可以RealActor通过提供适当的props定义来隐藏事实,即通过ActorManager -> RealActor隐式构建层次结构的适当定义

另请参阅此博客文章,为什么将平面actor层次结构视为反模式。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何创建一个可以访问函数及其对象的 JavaScript 包装器?

我如何包装一个元素及其所有未知的兄弟姐妹

如何将 dx-data-grid 及其工具包装到另一个组件中并使其成为控制器?

Nim:如何从另一个迭代器包装/派生一个迭代器?

如何终止一个悬空的akka演员?

演员模型:一个演员需要另一个演员的信息

如何找到需要另一个包装的包装?

在另一个演员中创建Akka演员

如何围绕另一个类方法包装装饰器?

如何编写一个提供默认参数的非常简单的包装器?

如何在 Blazor 中重用标记包装器,而不创建另一个组件

如何编写一个包装器来保持说唱效果?

如何在Keycloak SPI扩展中编写一个简单的事务包装器?

如何创建一个包装器来更改组件的道具反应

如何指定另一个类来隐藏输入包装器?

Cadence 是一个演员框架吗?

如何从字典构造一个defaultdict?

如何使用yum将一个包装替换为另一个包装?

在 Typescript 中创建一个 fetch 包装器

Scala是否有一个懒惰的评估包装器?

创建一个JavaFX场景包装器

在一个主要包装器中组合几个 div

创建一个可重用的Redux包装器

为 React 组件创建一个纯包装器

pdo 包装器最后一个 id 返回 0

在Python中创建使用另一个包装器的包装器

如何使用 Eigen 在矩阵块上构造一个方便的迭代器

如何构造一个Scala映射并将其作为arg传递给Python解释器中的Scala构造函数?

从一个区域返回一个通用的错误视图:如何从控制器区域使用_Layout包装器?