use*_*754 5 domain-driven-design event-sourcing
我正在使用事件采购实现有界的上下文,但遇到了一个问题.假设我正在为足球比赛建模,我对得分的个人进球(得分等)以及总得分感兴趣.因此,如果我有匹配聚合根,我理想情况下需要引发名为GoalScored和ScoreChanged的事件.我想要从域中明确说明得分的原因是我不希望有很多不同的侦听器和可能的其他有界上下文都计算相同的东西.
这看起来很简单,但是:Match对象有一个Goal()方法,可以添加一个新目标.根据事件源的精神,这并不会直接改变Match状态,而是引发一个在Match中处理的GoalScored事件,然后该状态会改变状态(以及被推送到非规范化器的事件).因此,在提高ScoreChanged方面,在处理GoalScored事件之前,分数实际上并未发生变化,因此我是否应该响应该事件(ScoreChanged)引发另一个事件,从而有效地链接事件?我不这么认为,一旦从事件存储器重新加载聚合根,就会在每次响应每个GoalScored时创建许多额外事件.
我还考虑了在命令处理程序中得出什么得分,它会引发GoalScored,类似于"假设"的情况.然后我可以在命令处理程序中引发两个事件.我真的宁愿不这样做 - 它似乎并不合适.计算得分足够简单,但其他游戏(例如板球)需要更多的工作.
我可以将目标和得分都放在GoalScored活动中,这是公平的,但同样看起来并不正确 - 得分与GoalScored活动本身无关.
讨论事件采购时使用的所有示例似乎都使用电子商务客户/订单域,我从未见过类似的情况.
有没有人有处理这种情况的经验?
谢谢
Seb*_*ood 13
与其他建模一样,选择干净的域事件应该会产生在域中镜像的概念.你说"得分与GoalScored事件本身无关".但确实如此.在足球比赛中,得分可以改变的唯一方式是进球得分.但是,可以收回目标,例如通过越位电话或其他处罚.目前尚不清楚您是否要对此进行建模.
域方法通常一次发出多个事件.一个好的框架可以很容易地将它们视为一堆,例如作为单个提交.为什么不同时发出GoalScored和ScoreChanged事件?
您可能还想考虑该域是否有任何命令.足球比赛本身就是记录系统.来自比赛的事件已经是历史记录.您是编写一个将事件流处理为更多事件流的系统吗?