事件采购,CQRS,DDD:一对多关系

时间:2017-08-15 17:32:15

标签: domain-driven-design cqrs event-sourcing

我是CQRS事件采购的新手。我试图定义什么是我的程序的聚合根。 让我们说我有这两个实体:汽车和人。还有一个不变量:汽车只能由一个人拥有。

它基本上是人与车之间的1-TO-M关联

我有三个命令:

  1. 重新绘制汽车(仅提供汽车ID)

  2. 更改车主(车辆ID和新人员ID)

  3. 重新绘制一个人拥有的所有汽车(仅提供人员ID)
  4. 如果我将Car用作AR,则命令#1可以快速运行。我将推送CarRepaint活动。命令#2也快速运行(推送CarIsOwnedBy事件) 但是问题出现在命令#3中,我需要遍历商店中的所有事件以获得特定人员拥有的每辆车。不变量也很容易实现。

    如果我使用Person作为AR,命令#3可以快速运行。我将为与该人相关的每辆车推送CarRepaint事件。 但是问题出现在命令#1,#2,我需要去看看商店里的所有事件,找到好车。我也有问题确保不变量保持正确。

    我是否以错误的方式处理问题?

    感谢您的帮助

2 个答案:

答案 0 :(得分:3)

  

我是否以错误的方式处理问题?

没有。你可能还没有完成,但到目前为止的方法是合理的。

要检查的第一件事是这个模型是否是Cars的权限,或者它是否只是记录来自其他权威机构(如真实世界)的数据。如果现实世界是权威,那么你需要考虑事件,而不是命令;领域模型不应该试图否决现实世界的证据。

但是假设目前该模型是权威,接下来要看的是你的失败模式(根据我的经验,专注于快乐的道路几乎没有告诉你如何组织你的模型)。如果四辆车中的一辆拒绝被涂漆,应该会发生什么?你不画它们吗?你又把他们弄掉了吗?你不管它们吗?

您可能想要考虑的另一件事是“所有汽车”的模糊性是否应该由模型支持。如果模型是汽车集合的记录簿,那么模型可以在命令在飞行中时更改该集合 。所以也许所有的车都不是正确的拼写。所有汽车截至特定时刻是不可改变的,但可能仍然含糊不清。此提供的列表中的所有汽车都是明确的。

您还应该考虑是描述命令(单个全部或全部事务)还是进程(协调多个命令)。可能是操作员只是开始绘制汽车的过程,模型进行编排,将相应的命令发送到集合中的每辆汽车。

答案 1 :(得分:1)

您未提及的几个选项可以让您解决此问题,而不会限制您只选择其中一个作为聚合根。

  1. 一个小的写入侧读取模型订阅相关事件并保持最新的Person拥有什么Car。命令处理器使用这个小模型来提供汽车ID,当"重新绘制一个人拥有的所有汽车时#34;命令被接受。
  2. A"重新绘制一个人拥有的所有汽车"命令提交预先从读取模型中检索的Car ID本身。 (这可能不适合您的域名,但在某些情况下,这是正确的安排,因为它允许代理提交命令在提交之前查看列表。)