我是CQRS事件采购的新手。我试图定义什么是我的程序的聚合根。 让我们说我有这两个实体:汽车和人。还有一个不变量:汽车只能由一个人拥有。
它基本上是人与车之间的1-TO-M关联
我有三个命令:
重新绘制汽车(仅提供汽车ID)
更改车主(车辆ID和新人员ID)
如果我将Car用作AR,则命令#1可以快速运行。我将推送CarRepaint活动。命令#2也快速运行(推送CarIsOwnedBy事件) 但是问题出现在命令#3中,我需要遍历商店中的所有事件以获得特定人员拥有的每辆车。不变量也很容易实现。
如果我使用Person作为AR,命令#3可以快速运行。我将为与该人相关的每辆车推送CarRepaint事件。 但是问题出现在命令#1,#2,我需要去看看商店里的所有事件,找到好车。我也有问题确保不变量保持正确。
我是否以错误的方式处理问题?
感谢您的帮助
答案 0 :(得分:3)
我是否以错误的方式处理问题?
没有。你可能还没有完成,但到目前为止的方法是合理的。
要检查的第一件事是这个模型是否是Cars的权限,或者它是否只是记录来自其他权威机构(如真实世界)的数据。如果现实世界是权威,那么你需要考虑事件,而不是命令;领域模型不应该试图否决现实世界的证据。
但是假设目前该模型是权威,接下来要看的是你的失败模式(根据我的经验,专注于快乐的道路几乎没有告诉你如何组织你的模型)。如果四辆车中的一辆拒绝被涂漆,应该会发生什么?你不画它们吗?你又把他们弄掉了吗?你不管它们吗?
您可能想要考虑的另一件事是“所有汽车”的模糊性是否应该由模型支持。如果模型是汽车集合的记录簿,那么模型可以在命令在飞行中时更改该集合 。所以也许所有的车都不是正确的拼写。所有汽车截至特定时刻是不可改变的,但可能仍然含糊不清。此提供的列表中的所有汽车都是明确的。
您还应该考虑是描述命令(单个全部或全部事务)还是进程(协调多个命令)。可能是操作员只是开始绘制汽车的过程,模型进行编排,将相应的命令发送到集合中的每辆汽车。
答案 1 :(得分:1)
您未提及的几个选项可以让您解决此问题,而不会限制您只选择其中一个作为聚合根。