JD *_*toy 28 validation domain-driven-design eventual-consistency cqrs
我有一个相当简单的域模型,涉及Facility聚合根列表.鉴于我正在使用CQRS和事件总线来处理从域引发的事件,您如何处理集合上的验证?例如,假设我有以下要求:
Facility必须有一个独特的名字.由于我在查询端使用最终一致的数据库,因此在事件处理或处理事件时,其中的数据不能保证准确.
例如,a FacilityCreatedEvent在查询数据库事件处理队列中等待处理并写入数据库.将新的CreateFacilityCommand内容发送到要处理的域.域服务查询读取数据库以查看是否Facility已经注册了具有该名称的任何其他数据库,但返回false,因为CreateNewFacilityEvent尚未处理并写入存储.新的CreateFacilityCommand将成功并抛出另一个FacilityCreatedEvent当事件处理器尝试将其写入数据库并发现另一个Facility已存在该名称时会爆炸.
JD *_*toy 18
我使用的解决方案是添加一个System聚合根,可以维护当前Facility名称的列表.在创建新的时Facility,我使用System聚合(只有一个System作为全局对象/单例)作为它的工厂.如果给定的设施名称已存在,那么它将抛出验证错误.
这使得验证约束保持在域内,并且不依赖于最终一致的查询存储.
最终一致性和设置验证中概述了三种方法:
另请参阅此相关问题:Uniqueness validation when using CQRS and Event sourcing