CQRS - 域例外与特殊情景的事件

Tol*_*olu 6 domain-driven-design cqrs

我想知道是否最好发布事件而不是从聚合中抛出异常.比如说,我有一个域名,要求只有特定年级的学生可以报名参加体育比赛.如果我对不符合条件的学生调用EnrollForSports,聚合是否应该抛出异常或发布事件,特别是如果其他聚合或流程管理者对流程的结果感兴趣?

如果发布了一个事件,这是不是意味着在我们重放时需要相应的内部事件处理程序来处理事件,即使事件不会改变聚合的状态?

如果抛出异常,其他方将如何得到通知?命令处理程序可以捕获异常然后引发事件吗?可以从命令处理程序中引发事件吗?

rma*_*mac 5

原则上,命令应该有效并执行,或者无效且不执行.产生错误事件的想法让你处于中间位置,并且发送命令的任何人的反馈都是模棱两可和延迟的.在您的域中,这也是一种不必要的复杂性.如果您抛出异常,它将立即作为对发送命令的客户端代码的反馈.

  • 当然,只有同步抛出异常,而不是复杂的传奇或流程管理器创建后续级联的事件和命令的某个地方,立即反馈才会起作用. (6认同)

Den*_*aub 5

这个问题一般不能回答。没有“最佳实践”,这真的取决于很多因素。

尽管如此,这个话题最近才在 DDD/CQRS 邮件列表中讨论过。阅读它,您可能会在那里找到一些有趣且有用的观点。

哦,这里有一篇关于该主题的博客文章:业务错误只是普通事件