我了解命令和事件之间的区别,但在很多情况下,您最终会在两个基本相同的类(ThingNameUpdateCommand、ThingNameUpdatedEvent)之间产生冗余和映射。对于这些简单的情况,您/您是否也可以将事件用作命令?人们是否将所有命令和所有事件都序列化到存储中?对我来说似乎有点多余。
2 回答
所有这些冗余都是有原因的,出于多种原因,您希望避免将相同的消息用于两个不同的目的:
- 源事件在发生变化时必须进行版本控制,因为它们会在您对聚合根进行水合时被存储和重新使用(反序列化)。如果该类也被用作消息,那会让事情变得有点尴尬。
- 耦合增加了,现在命令处理程序、域模型和事件处理程序正在使用相同的类。将指挥方与事件分离可以简化您今后的生活。
- 最后清晰。命令以要求完成某事的语言发出(通常是命令式)。事件是已经发生的事情的表示(通常是过去时)。如果您对两者使用相同的类,这种语言就会变得混乱。
最后,这些只是数据类,这不像是“硬”代码。对于像代码生成这样的简单场景,有一些方法可以实际避免一些输入。例如,我知道 Greg 过去曾使用 XML 和 XSD 转换来创建给定域所需的所有类。
我会说对于很多简单的情况,您可能想质疑这是否真的是领域(即建模行为)或只是数据。如果只是数据,请考虑在此处不使用事件溯源。下面是 Udi Dahan 的演讲链接,该演讲关于分解您的领域模型,以便并非所有领域都需要事件溯源。我自己现在有点符合这种思维方式。
http://skillsmatter.com/podcast/design-architecture/talk-from-udi-dahan
在完成了一些示例,尤其是 Greg Young 的演示文稿 ( http://www.youtube.com/watch?v=JHGkaShoyNs ) 之后,我得出的结论是命令是多余的。它们只是来自您的用户的事件,他们确实按下了该按钮。您应该以与其他事件完全相同的方式存储这些数据,因为它是您不知道是否要在将来的视图中使用它的数据。您的用户确实添加了该项目,然后从篮子中删除了该项目,或者至少尝试这样做。您稍后可能希望使用此信息来提醒用户这一点。