【发布时间】:2014-11-01 22:15:54
【问题描述】:
Aggregate-roots 用于控制状态变化——当前允许什么,不允许什么。如果允许状态转换,请继续。如果不是,你抛出一个异常解释为什么它不被允许。
但是如果一个状态-改变没有发生,因为它已经处于请求的状态怎么办? ?
例如,如果您的聚合根上有一个Approve 方法,并且在调用它时状态已经被批准?
- 是否应抛出异常“XYZ 已获批准”?
- 还是应该默默地忽略?
- 或者应该再次“发出信号”状态更改(事件溯源,下一段)?
在我的例子中,我使用事件溯源,因此如果发生状态更改,则会发出一个事件。在我的事件流中包含没有真正状态更改的事件对我来说并不“干净”,因为我想确信这些事件实际上是由于状态更改操作而产生的。
有经验法则吗?
编辑:
在所描述的情况下,批准一个被批准的元素并不会真正受到伤害。所以倾向于这种方式(谢谢@Eben Roux,@guillaume31)。
但让我们再添加一点香料(问题背后的实际问题):
假设:
- 消息总线
- 异步命令/事件处理
- 流程管理器
如果 process-manager(又名 saga)发出命令(异步)并想知道命令是否成功,该怎么办?我认为如果流程管理器不必关心这个实施细节,它会减少心理负担/错误来源。 p>
我看到了 3 种处理方法:
- 在总线上发送了“ID 为 ABC 的命令成功/失败”消息
流程管理器等待那个消息而不是事件 - 使 命令执行同步
如果 process-manager 没有遇到异常,一切正常,继续 - 介绍一个新活动
ApprovalDeclined { WasAlreadyApproved = true }
此外,流程管理器等待此事件 - 偏角是汇总历史的一部分,也许是优势,也许永远不需要......
我知道:“这取决于”
但是你能想到任何其他(更优雅/更容易/不同)的解决方案吗?您最喜欢的处理此问题的“流程管理器兼容”方式是什么?
【问题讨论】:
标签: domain-driven-design state event-sourcing aggregateroot saga