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 个同名用户。
如何避免这种情况?如何使聚合和预测一致?