事件和命令的差异和命名约定

时间:2018-11-21 09:35:40

标签: events design-patterns architecture domain-driven-design cqrs

我最近在区分两者时遇到了一些困难。更具体地说,我浏览了stackoverflow,并且有一条声明可以用两种不同的方式来命名事件: 带有“ ing”或过去时“ ed”。可以在这里Events - naming convention and style中看到 https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-type-members

同时,CQRS指出名称必须使用过去时,然后按照其准则,上面以“ ing”形式命名的事件将成为命令。这让我有些困惑?事件是否根据建筑环境和运动而具有不同的含义。是否有关于事件和命令是什么的统一视图?

2 个答案:

答案 0 :(得分:1)

您一直阅读的

CQRS仅具有过去时的事件名称,可能是因为它们不考虑事前事件。命令命令某些事情发生,因此通常是命令式的(“喀哒!”,“开火!”,“滴答!”)。将命令变成gerund毫无意义(“单击!单击速度更快,您!否则我将您解雇!”)。当它引发一个动作时,很可能会触发一个或多个通知(=事件),说明有一些注意事项即将发生,然后发生了一些值得注意的事情。

-ing事件(例如(“ Clicking”)事件)在处理该事件之前发生,例如在有人要停止的情况下发生。有时,它们被称为“ before”事件(例如“ BeforeClick”)或“ will”事件(“ WillClick”)。

-ed事件(例如“点击”)在事件处理后发生,例如为了影响家属。有时,它们被称为“发生”事件(例如“ AfterClick”)或“发生”事件(“ DidClick”)。

只要您(和您的团队以及您的潜在合作伙伴)对此保持一致,那么遵循的具体方案并不重要。由于CQRS(以该名称命名)在很大程度上是Microsoft的事情,因此请遵循Microsoft所说的。如果您为Mac编写代码,则概念是相似的-但最好使用Apple guidelines

答案 1 :(得分:1)

  

关于什么是事件和命令有统一的看法吗?

统一了吗?不,可能不会。但是,如果您想要一个权威性定义,那么Gregor Hohpe的Enterprise Integration Patterns是一个不错的起点。

CQRS中,您应该认为Greg Young的观点是权威的。他非常清楚,命令消息应该使用命令式拼写,事件使用过去完成的更改拼写。

CommandsEvents的名称应理解为拼写约定,这与URI的拼写或变量名的约定非常相似。正确与否完全无关紧要,并且计算机在很大程度上不会查看拼写(例如,我们根据消息名称而不是动词时态来路由消息)。

事件描述了模型状态的变化;所有事件均为ModelChanged。但是,我们更愿意为事件的type使用特定于域的拼写,以便可以更容易地区分它们:MouseClickedConnectionClosedFundsTransfered,依此类推

对于事件名称使用当前渐进式时态拼写是很奇怪的,只要消息是在事务处理点上对域模型的描述,当前时态在语义上会延伸到该时间点。更宽松地说,现在的进步状态描述的是当前状态,而不是过去的状态变化。

也就是说,很难找到pre-events的过去式拼写很困难,最终这只是一个拼写约定;与采取自然但不正确的动词时态相比,寻找与过去时惯例一致的准确拼写所需要的工作可能并没有回报。