聚合根源在那里可以控制状态变化 - 当前允许的和不允许的。如果允许状态转换,继续。如果不是,你会抛出一个异常,解释为什么它不被允许。Aggregate-Root:State更改或失败,异常或...?
但什么是如果国有变化不会发生,因为它是已经在请求国?
例如,如果您的聚合根目录上有Approve
方法,并且在调用该方法时状态已被批准?
- 如果一个抛出异常一拉 “XYZ已经批准”?
- 还是应该是默默忽略?
- 还是应该状态变化再次“发信号”(事件采购,下一段)?
在我的情况下,我使用事件源,所以如果发生状态改变,事件正在发射。在我的事件流中发生没有真正状态变化的事件并不会对我感觉“干净”,因为我希望确信这些事件实际上是由于改变状态的行为而产生的。
有没有经验法则?
编辑:
在所描述的情况下批准认可的元素不会真的伤害。所以倾向于这种方式(谢谢@Eben Roux,@ guillaume31)。
但是,让我们多一点香料添加到它(这个问题背后的实际问题):
假设:
- 消息总线
- 异步命令/事件处理
- 一个进程管理器
如果进程管理器(aka saga)发出命令(异步)并想知道命令是否成功会怎么样?我认为如果进程管理器不必关心关于这个实现细节,那么减少精神负载/错误来源。
我看到处理3种方式是:
- 有“命令ID为ABC成功/失败”总线
流程管理器等待发送的该消息,而不是事件的信息 - 使命令执行同步
如果流程管理器遭遇也不例外,一切都很好,继续前行 - 引入新的事件此事件
ApprovalDeclined { WasAlreadyApproved = true }
额外的过程管理器等待 - 磁偏角是集合历史记录,也许是有利的,也许根本不需要的部分...
我知道:“它取决于“
但你能想到任何其他(更优雅/更容易/不同)的解决方案吗?处理这个问题最喜欢的“过程管理器兼容”方式是什么?
是的,+1取决于您的域名(或者,或者常识)。 – 2014-09-30 12:18:28