【发布时间】:2017-08-01 16:14:34
【问题描述】:
我不经常在 StackOverflow 上写东西,但我想分享一下我对 CQRS/ES 实现的理解的想法。我对不同组件的职责感到很困惑,我想我终于明白了这个话题。如果您能告诉我我的理解是否正确,那就太好了。
一步一步:
用户创建并触发一个命令,该命令是一个对象,表示在域中执行请求的更改所需的最小值。该命令已分配处理函数。在使用 CommandBus 的场景中,分离的 Dispatcher 将触发 CommandHandler 执行操作。 CommandBus 可以使用任何消息传递系统、数据库来实现,也可以只在内存中工作。
CommandHandler的职责是验证命令,然后根据业务规则创建一个或多个Events并发送给EventStore。
可以在聚合上调用命令。聚合是由一个或多个实体和值对象组成的对象。 Aggregate 的目的是不仅可以验证命令本身,还可以在“聚合”状态的上下文中验证命令。
EventStore 可以使用消息传递系统或数据库来实现。事件总是以过去分词动词命名,例如 OrderConfirmed。它们由 EventHandlers 使用。
EventHandler 是一个负责“投影”的函数,这意味着在数据库中实际保存内容。它还可以执行其他操作,例如发送电子邮件,一切都取决于事件的初始目的。
如果我有任何错误,请纠正我。我还有几个问题。
在 CommandHandler 生成多个事件以将多个对象保存在数据库中的情况下,我是否可以为它们分配相同的 UUID,以便稍后我还将保存在所有投影对象中?
EventHandler 可以触发另一个命令或创建另一个事件吗?在这种情况下,最佳做法是什么?
感谢您的回答。
【问题讨论】:
-
听说过分而治之吗? =P
-
@plalx 如果您指的是我的第一个。问题不是个案。无论如何,据我所知 CommandHandler 可以生成多个事件。
-
我指的是整个问题。
标签: domain-driven-design cqrs event-sourcing