【发布时间】:2015-02-22 22:11:28
【问题描述】:
我想总结一下我对 CQRS/ES 的了解。前段时间我开始阅读这个主题,由于我是年轻的开发人员,我并不了解这个概念的各个方面。我将尝试通过一些示例流程来描述我对 CQRS 的理解。因此,定义该架构的一般步骤,我们有以下流程:
用户向我们的控制器发出请求。在该控制器方法中,我们创建指定的 Command(例如 CreateOrder)并将其传递给 Handler。
全局消息总线(或处理程序)负责将命令路由到指定的命令处理程序。所以这里我们将命令传递给 CreateOrderHandler
在处理程序中,我们创建 Aggregate root(在本例中为 OrderAggregate)并应用来自 EventStore 的所有事件。在 EventStore 中,我们只保留与指定聚合相关的事件数据(由全局 id 定义)。所以在这一步之后,我们就有了当前状态的聚合。
创建聚合后,我们将命令传递给它,并在方法中验证命令是否可以执行。如果我们可以运行此命令,我们将创建 Event(在本例中为 OrderCreated)。
如果没有任何异常,我们将 Event 保存到 EventStore 中(我认为使用 NoSql DB 和简单的保存事件很简单)
现在处理程序将保存的事件传递给我们的 Denormalizer 类,该类是创建 View Models 的网关。因此,如果 denormalizer 得到一些事件,它会更新/创建我们应用程序中的所有 ViewModel。我们将 ViewModel 保存在单独的数据库中。
用户可以查询更新的视图模型。
所以我这是我对 CQRS/ES 理解的简化版。请在每一层上纠正我。我的问题是:
在第 4 步中,我们创建了聚合,我们应该将此聚合保存在数据库中吗?保持当前状态。我在这里错过了什么吗?我们创建聚合只是为了检查创建事件的可能性?
我应该有实体吗?如果我在第 5 步中是正确的,我可以更新聚合实体并在我的视图模型中使用它们。我在这里有最大的困惑。
感谢所有回答;)
【问题讨论】:
-
我只读过这个主题,但是 afaik。您可以使用“快照”保存实际聚合,因此您不必总是从零开始构建它。