我有一个相当简单的域模型,涉及一系列Facility
聚合根。鉴于我使用 CQRS 和事件总线来处理从域引发的事件,您如何处理集合的验证?例如,假设我有以下需求:
-
Facility
必须有一个唯一的名称。
由于我在查询端使用最终一致的数据库,因此在事件处理器或处理事件时不能保证其中的数据是准确的。
例如,一个FacilityCreatedEvent
正在查询数据库事件处理队列中等待处理并写入数据库。一个新的CreateFacilityCommand
被发送到要处理的域。域服务查询读取数据库以查看是否还有其他Facility
已使用该名称注册,但返回 false,因为CreateNewFacilityEvent
尚未被处理并写入商店。新的CreateFacilityCommand
现在会成功并抛出另一个FacilityCreatedEvent
当事件处理器尝试将其写入数据库并发现另一个Facility
已经以该名称存在。
我采用的解决方案是添加一个System
聚合根可以维护当前的列表Facility
名称。当创建一个新的Facility
, 我用System
聚合(只有一个System
作为全局对象/单例)作为它的工厂。如果给定的设施名称已经存在,则会抛出验证错误。
这将验证约束保留在域内,并且不依赖于最终一致的查询存储。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)