如何使用JOliviers的CommonDomain和EventStore获取聚合列表?

时间:2011-08-19 08:21:28

标签: cqrs event-sourcing event-store

CommonDomain中的存储库仅公开“GetById()”。那么,如果我的处理程序需要一个客户列表,该怎么办?

沃纳

4 个答案:

答案 0 :(得分:3)

在您的问题的面值上,如果您需要对多个聚合执行操作,您只需在命令中提供每个聚合的ID(客户端将从查询端获取),然后从中获取每个聚合存储库。

但是,根据另一个答案查看您的一条评论,我看到您实际指的是基于设置的验证。

这个问题引发了很多关于如何做到这一点的争论,Greg Young has written an blog post on it.

经典问题是“在处理'CreateUserCommand'时,如何检查用户名是否尚未使用过。我相信建议的方法是假设客户端已经通过在发出命令之前询问查询端来完成此检查。创建用户聚合时,查询端将引发并处理UserCreatedEvent。这里,插入查询将失败(由于数据库中的检查或唯一约束),并且将发出补偿命令,这将删除新创建的聚合,并可能通过电子邮件通知用户已告知用户名已被占用。 / p>

重点是,您假设客户已完成检查。我知道这种方法一开始很难掌握 - 但这是最终一致性的本质。

另外,您可能需要阅读this其他相似的问题,其中包含来自Udi Dahan的明智字词。

答案 1 :(得分:0)

您不需要处理程序中的客户列表。每个聚合必须在自己的事务中处理。如果您想向用户显示此列表 - 只需构建适当的视图。

答案 2 :(得分:0)

您的命令需要包含它应该操作的聚合根的id。 客户端使用readmodel中的视图发送命令将查找此ID。此视图将填充来自您发布的AR事件的数据。

答案 3 :(得分:0)

在经典事件采购模型中,获取所有客户的查询将由一个单独的查询处理程序执行,该处理程序侦听域中的所有事件并构建查询模型以满足相关问题。

例如,如果您需要按姓氏查询客户,您可以收听所有客户创建和客户名称更改事件,并将一个姓氏表更新为客户ID对。您可以保存与显示数据的UI相关的其他信息,或者您可以简单地保存ID并转到相关客户的存储库,以便与他们进一步合作。