我并不是经常在StackOverflow上写东西,但我想分享一下我对CQRS/ES实现的理解。我对不同部件的责任感到困惑不解,我想我终于开始讨论这个话题。如果你能告诉我我的理解是否正确,那会很好。我对CQRS/ES的理解是否正确?
一步一步:
用户创建并触发一个命令,它是代表执行在域中所请求的变化所需的最小值的对象。该命令已分配处理函数。在使用CommandBus的情况下,分离的Dispatcher将触发CommandHandler执行操作。 CommandBus可以使用任何消息传递系统,数据库来实现,或者可能仅仅在内存中工作。
CommandHandler的责任是验证命令,然后根据业务规则创建一个或多个事件并将其发送到EventStore。
命令可以在Aggregate上调用。 Aggregate是一个由一个或多个实体和ValueObjects组成的对象。聚合的目的是使得不仅可以自己验证命令,而且可以在“聚合”状态下验证命令。
可以使用消息传递系统或数据库来实现EventStore。事件总是以过去分词动词命名的,例如OrderConfirmed。它们被EventHandlers使用。
EventHandler是一个负责“投影”的功能,这意味着实际在数据库中保存东西。它还可以执行其他操作,例如发送电子邮件,一切都取决于事件的初始目的。
请纠正我,如果我在任何一点都错了。我仍然有几个问题。
在当CommandHandler正在生成多个事件保存在数据库中的多个对象,我可以将它们分配相同的UUID,后来我也将保存在所有投射对象的情况下?
EventHandler是否可以触发另一个命令或创建另一个事件?这种情况下的最佳做法是什么?
感谢您的回答。
曾听说过分而治之? = P – plalx
@plalx如果你指的是我的第一个。质疑它不是案件。无论如何,据我所知CommandHandler可以生成多个事件。 –
我指的是整个问题。 – plalx