我有一个相当简单域模型涉及一个列表中的 Facility 总的根源。鉴于我使用CQRS和事件的总处理事件提出自域,怎么可能你处理验证上?例如,说我有以下要求:

  1. Facility's必须有一个独特的名称。

因为我使用的一个最终一致的数据库上查询边,它的数据是不能保证准确,在事件的时间processesor进程的事件。

例如,一个 FacilityCreatedEvent 是的查询数据库的事件处理排队等待处理并写入数据库。一个新的 CreateFacilityCommand 被送到该领域进行处理。该领域的服务查询的读数据库,以查看是否有任何其他 Facility's的登记已经与该名称,但返回虚假的因为 CreateNewFacilityEvent 尚未处理并写入商店。新的 CreateFacilityCommand 现在将成功,另一个扔了 FacilityCreatedEvent 这将炸毁事件时处理器试图把它写入数据库,并认为另一个 Facility 已经存在的与这个名字。

有帮助吗?

解决方案

该解决方案我就是添加一个 System 根聚集,可能维持一个列表中的当前的 Facility 名字。当创建一个新的 Facility, 我用的 System aggregate(只有一个 System 作为一个全球目/singleton)作为一个工厂进行。如果给定的设施名称已经存在,那么它将引发一个验证错误。

这使验证制约的领域内和不依赖于最终一致的查询商店。

其他提示

三种办法中概述 最终一致性和集验证:

  1. 如果问题是罕见或不重要的是,处理它在行政上,可能通过发送通知给管理员。
  2. 派遣一个DuplicateFacilityNameDetected事件,这可能启动一个自动化的决议的过程。
  3. 维持服务,知道关于使用的设施名称,也许听到的领域事件和维持持久性名单的名字。之前创造任何新的设施,检查与本服务的第一个。

还看这个相关的问题: 独特性验证当使用CQRS和事件的采购

在这种情况下,可能实现一个简单的。式服务,基本上不会插入一个Sql表的一个主要的关键制约因素。

插入只会发生一次。当重复的命令具有相同的价值,应该只存在一个时间命的集合体,聚集的电话服务,该服务未插入的操作,由于违反的首要主要的限制因素,会引发一个错误,整个过程的失败和没有活动都产生的,没有报告在查询面,也许有报告的失败表中对最终一致性检查,用户可以查询知道的状态的命令处理。到检查,只是查询一次又一次命令状态视图模型的命令Guid。

显然,当命令拥有的价值,不存在表主键检查,操作是一个成功。

表中的主要关键制约因素应当只用作为一种服务,但是,因为你实现的事件采购,可以重放该事件的重建表的主要关键制约因素。

因为独特性检查,将之前完成数据编写的,所以更好的方法是建立一个事件的跟踪服务,这将发送通知当进程完成或终止。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top