我是CQRS/ES世界的新手,我有一个问题。我正在开发一个使用事件源和CQRS的发票Web应用程序。

我的问题是-据我了解,进入系统的新命令(例如ChangeLineItemPrice)应通过域模型,以便可以将其验证为合法命令(例如,检查此订单项是否确实存在,价格不违反任何业务规则等)。如果一切顺利(不拒绝该命令)-那么将创建并存储适当的事件(例如LineItemPriceChanged)

我不太了解的事情是,在尝试应用命令之前,如何在我的内存中保留此聚合。如果我的系统中有100万张发票,是否应该在每次应用命令时都播放全部历史记录?我是否总是在没有任何验证的情况下保存事件,并且在构造 View 模型/投影时是否进行验证?

如果我误解了过程的任何部分,请多多关照。

谢谢你的帮助!

最佳答案

您并不孤单,这是一个常见的误解。首先让我回答验证部分:

在这种系统中,有两种验证类型。第一种是您在其中查找有效电子邮件地址,仅数字或必填字段的类型。这种类型是在命令发出之前完成的。包含此类问题的命令不应作为命令提出(对于皮带和花括号,您可以在域侧进行检查,但这不是域问题,最好避免这种情况)。

下一种验证类型是是域关注点。您可能会提到在某种指定参数范围内检查价格的事情。这是业务人员将理解,执行并能够表达的领域概念。

下一阶段是域应用状态更改并引发关联事件的步骤。然后,这些将继续存在并获得成功,并在应用程序的其余部分中发布。

所有这些都可以通过内存中的聚合来完成。这些 Action 与处理该命令的域服务协调。它加载聚合,应用所有过去的事件(或加载快照),然后发出命令。命令执行成功后,它会请求所有新的未提交事件,并尝试保留它们。成功发布新事件。

如您所见,它仅加载该特定聚合的事件。即使发生很多事件,此过程也很快。如果性能存在问题,则可以应用一些策略,例如将聚合保留在内存中或创建快照。

关于验证事件的最后一点。由于它们只能由您的汇总生成,因此值得信赖。

如果您想了解更多详细信息,请查看我对CQRS和ES here的概述。看看我的帖子,关于如何构建聚合根here

祝您好运-希望他们能为您提供帮助!

关于domain-driven-design - CQRS集合体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31461546/

10-11 02:14