Domain driven design 我对CQRS/ES的理解正确吗?

Domain driven design 我对CQRS/ES的理解正确吗?,domain-driven-design,cqrs,event-sourcing,Domain Driven Design,Cqrs,Event Sourcing,我不经常在StackOverflow上写东西,但我想分享一下我对CQRS/ES实现的理解。我被不同组成部分的责任弄糊涂了,我想我终于了解了这个话题。如果你能告诉我我的理解是否正确,那就太好了 逐步: 用户创建并触发一个命令,该命令是表示在域中执行请求的更改所需的最小值的对象。该命令已分配处理程序功能。在使用CommandBus的场景中,分离的调度器将触发CommandHandler来执行操作。CommandBus可以使用任何消息传递系统、数据库或仅在内存中工作 CommandHandler的职责

我不经常在StackOverflow上写东西,但我想分享一下我对CQRS/ES实现的理解。我被不同组成部分的责任弄糊涂了,我想我终于了解了这个话题。如果你能告诉我我的理解是否正确,那就太好了

逐步:

  • 用户创建并触发一个命令,该命令是表示在域中执行请求的更改所需的最小值的对象。该命令已分配处理程序功能。在使用CommandBus的场景中,分离的调度器将触发CommandHandler来执行操作。CommandBus可以使用任何消息传递系统、数据库或仅在内存中工作

  • CommandHandler的职责是验证命令,然后根据业务规则创建一个或多个事件并将其发送到EventStore

  • 可以对聚合调用命令。聚合是由一个或多个实体和ValueObject组成的对象。聚合的目的是使命令不仅能够自己验证,而且能够在“聚合”状态的上下文中验证

  • EventStore可以使用消息传递系统或数据库实现。事件总是用过去分词动词命名,如orderconfirm。它们被EventHandler使用

  • EventHandler是一个负责“投影”的功能,这意味着在数据库中实际保存内容。它还可以执行其他操作,例如发送电子邮件,一切取决于事件的初始目的

  • 如果我有什么地方错了,请纠正我。我还有几个问题要问

  • 在CommandHandler生成多个事件以在数据库中保存多个对象的情况下,我是否可以为它们分配稍后也将保存在所有投影对象中的相同UUID

  • EventHandler能否触发其他命令或创建其他事件?在这种情况下,最佳做法是什么

  • 谢谢你的回答

    一种命令,它是一个对象,表示在域中执行请求的更改所需的最小值

    不完全正确。它是一条消息,或者至少是一条消息的表示,而不是一个“对象”,域模型也是如此

    EventHandler的职责是验证命令,然后根据业务规则创建一个或多个事件并将其发送到EventStore

    这有点混乱-您可能在这里指的是命令处理程序

    可以对聚合调用命令

    非常接近-更正确的说法是在聚合根上调用该命令。在最初的Evans公式中,聚合将在其边界内指定一个实体作为聚合根,也就是说,它将是所有命令和查询的一个访问点

    在CQRS文献中,命令和查询被分开处理;聚合及其根仅用于命令

    EventStore可以使用消息传递系统或数据库实现

    EventStore扮演着记录簿的角色;这意味着它需要支持最低耐久性保证—在“确定”事件可用于重新启动时重新加载聚合之前,不应允许任何人查看事件

    事件总是用过去分词动词命名,如orderconfirm。它们被EventHandler使用

    事件和命令一样,只是消息;它们可以按你喜欢的任何方式食用

    EventHandler是一个负责“投影”的功能,这意味着在数据库中实际保存内容

    “投影”通常被理解为创建事件历史(由一个或多个来源产生)的非权威表示。其动机是,在从历史中创造一个代表性方面,通常有重要的工作要做;如果您试图支持低延迟查询,并且对更改发生和更改可见之间的时间间隔感到满意,则可以通过创建更适合快速查询的数据结构来改善延迟(或者,只需使用查询答案的表示预加载缓存)

    注:非权威性很重要。此数据库不是记录簿,而是事件存储

    在CommandHandler生成多个事件以在数据库中保存多个对象的情况下,我是否可以为它们分配稍后也将保存在所有投影对象中的相同UUID

    这个问题不清楚。投影对象将由事件构造,因此您通常期望投影对象中的任何UUID都是从事件中的数据派生的

    另外,生成事件的通常不是命令处理程序——这是域模型的责任;这意味着它发生在聚合根后面

    EventHandler能否触发其他命令或创建其他事件?在这种情况下,最佳做法是什么

    一种常见的模式是进程管理器,它是一个状态机:向它传递事件以从一个状态转换到另一个状态,然后查询它以找出哪些命令不应被调度

    一种命令,它是一个对象,表示在域中执行请求的更改所需的最小值

    不完全正确。它是一条消息,或者至少是一条消息的表示,而不是一个“对象”,域模型也是如此

    EventHandler的职责是验证命令,然后根据业务规则创建一个或多个事件并将其发送到EventStore

    这有点混乱-您可能在这里指的是命令处理程序

    可以对聚合调用命令

    非常接近-更正确的说法是在聚合根上调用该命令。在里面