我是传奇的新手。
这是一个简单的场景:
整个工作流程为:
NEW
- > SUBMITTED
。SUBMITTED
的用户可以取消提交,订单会切换回NEW
。 VALIDATED
或REJECTED
。 REJECTED
原始用户必须修改订单,然后再将其置于验证之前。 所以我需要避免在NEW
正在进行时订单可以回滚到VALIDATION
。
我的问题是,对于第3步,最好是:
感谢
答案 0 :(得分:1)
DDD
与域名有关,因此首先您需要了解业务需求。那么,让我们看看有哪些规则:
The validation process
可能需要一些时间,可以取消。如果取消,则可以再次提交订单The validation process
可以拒绝订单或接受订单话虽这么说,我会将两个流程分开(订单创建+创建和订单验证)。另外,我会在OrderAggregate
上保留一个状态属性,用于强制执行其不变量。状态可以是:
new
:创建订单或取消验证或拒绝订单后submitted
:提交验证后sent
:验证过程接受后。如果您需要附加行为, 应该仅添加 新状态。
OrderValidationSaga
还具有内部状态,用于跟踪从外部服务收到的外部响应。我们假设我们需要使用两个外部服务。状态将是具有两个属性的对象:service1IsOk
和service2IsOk
。当任何服务表明订单无效时,无论内部进度如何,saga都会拒绝订单并重置其内部状态。当服务说OK时,saga在内部将其标记为OK,然后检查所有服务是否正常。如果它们没问题,它会告诉聚合发送订单。然后聚合将订单标记为sent
并发出事件。如果/当进程被取消时,saga将重置其内部状态。
请注意,如果您使用CQRS
,则通过发送命令和引发事件来完成所有状态更改。该传奇将订阅事件并将相应的命令发送到聚合。
有一篇很好的文章here。