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