我想知道发布事件是否更可取,而不是从聚合中抛出异常。比如说,我有一个域名,要求只有特定年级的学生可以报名参加体育比赛。如果我在不满足条件的学生上调用EnrollForSports,聚合是否应该抛出异常或发布事件,特别是如果其他聚合或流程管理者对流程的结果感兴趣?
如果发布了一个事件,这是不是意味着在我们重放时需要相应的内部事件处理程序来处理事件,即使事件不会改变聚合的状态? / p>
如果抛出异常,其他方将如何得到通知?命令处理程序可以捕获异常然后引发事件吗?可以从命令处理程序中引发事件吗?
答案 0 :(得分:5)
主要说来,命令应该有效并执行,或者无效且不执行。产生错误事件的想法让你处于中间位置,并且发送命令的任何人的反馈都是模棱两可和延迟的。在您的域中,这也是一种不必要的复杂性。如果您抛出异常,它将立即作为对发送命令的客户端代码的反馈。
答案 1 :(得分:3)
这个问题一般无法解答。没有“最佳实践”,这实际上取决于很多因素。
然而,这个主题有just recently been discussed at the DDD/CQRS mailing list。阅读它,你可能会在那里找到一些有趣和有用的点。
哦,这是关于这个主题的博文:Business Errors are Just Ordinary Events