我和演员模特儿的关系很纠结。让我举个简单的例子。系统中有两种参与者类型:仓库和项。物品总是分配给特定的仓库。AddStock命令允许增加分配给给定仓库位置的库存数量。只有仓库知道自己的位置,所以项目必须询问仓库是否有效地执行自己的业务逻辑。我想出了一些解决办法
仓库命令( location.
我不喜欢这两种解决办法。它给简单的任务增加了许多不必要的复杂性。我认为这可能是OOP思想的问题,而分布式角色世界是由它自己的规则管理的。
在我的场景中,我认为项目和仓库都是单独的集合。它们都被实现为持久化的Actor (通过集群切分)。
只要假设只有仓库可以调用Item::AddStock,一切都很简单。然后仓库就会在呼叫前确认位置。但是,人们可以直接调用Item并跳过所有的验证。物品没有办法知道是否有适当的仓库打电话。它很容易在纯OOP/DDD方法中实现。项目知道仓库ID,更改数量如下所示
item.addStock("L2", 100, warehouse)
了解仓库id的项目可以验证是否提供了仓库。而拥有仓库可能会询问地点是否有效。我当前项目处理程序的实现:
case AddStock(region, location, quantity) => {
region ? EntityEnvelope(warehouseId, HasLocation(location)) map (
_ => VerifiedAddStock(quantity)
) pipeTo self
VerifiedAddStock是Item`s的私有对象,所以我确定谁是命令颁发者(几乎是因为它没有强制执行标识)。
那么问题是如何在演员世界中建立这样的关系呢?传阅碎屑地区的标准是什么?
有人可能认为这是由于不适当的聚合/参与者边界而导致的设计缺陷,但这只是一个例子。
发布于 2020-09-11 22:16:33
物品是否有仓库不关心的信息(例如描述)?
如果答案是否定的,那么我只会将项目视为相关仓库位置的子级(即反转关系的方向)。只要仓库从未为项目分配ActorRef,您就可以确保只有它才能向项目参与者发送消息(Akka类型允许您提供这种静态保证)。
如果答案是肯定的,我建议在仓库库存的上下文中,一个项目完全由该上下文中所需的信息组成,例如,类似目录描述的内容是不同上下文的责任(很可能是一个不同的服务),如果目录描述上下文需要了解一些关于库存的信息(例如,它在任何地方都是库存的),那么它应该利用仓库库存发出的域事件。
https://stackoverflow.com/questions/63843508
复制相似问题