Aggregate
可以使用View
这个事实是在Vaughn Vernon
's book 中描述的:
此类读取模型投影经常用于向各种客户端(例如桌面和 Web 用户界面)公开信息,但它们对于在有界上下文及其聚合之间共享信息也非常有用。考虑发票聚合需要一些客户信息(例如,姓名、账单地址和税号)以计算和准备正确发票的场景。我们可以通过 CustomerBillingProjection 以易于使用的形式捕获此信息,这将创建和维护 CustomerBilling-View 的专有实例。此读取模型可通过名为 IProvideCustomerBillingInformation 的域服务用于发票聚合。在幕后,这个域服务只是在文档存储中查询适当的 CustomerBillingView 实例
让我们想象一下,我们的应用程序应该允许创建许多用户,但具有唯一的名称。命令/事件流:
CreateUser{Alice}
发送的命令UserAggregate
检查UsersListView
,因为没有名为 Alice 的用户,聚合决定创建用户并发布事件。UserCreated{Alice}
事件发布 // 由 UserAggregateUsersListProjection
已处理UserCreated{Alice}
// 为简单起见,让我们认为 UsersListProjection 只是在收到时累积用户名UserCreated event
。CreateUser{Bob}
发送的命令UserAggregate
检查UsersListView
,因为没有名为 Bob 的用户,聚合决定创建用户并发布事件。UserCreated{Bob}
事件发布 // 由 UserAggregateCreateUser{Bob}
发送的命令UserAggregate
检查UsersListView
,因为没有名为 Bob 的用户,聚合决定创建用户并发布事件。UsersListProjection
处理过UserCreated{Bob}
。UsersListProjection
处理过UserCreated{Bob}
。
问题是 -UsersListProjection
没有时间处理事件并且包含不相关的数据,聚合使用了这些不相关的数据。结果 - 创建了 2 个同名用户。
如何避免这种情况?如何使聚合和预测一致?