CommonDomain中的存储库只公开了" GetById() "。那么,如果Handler需要一个customer列表,该怎么办呢?
从问题的表面上看,如果需要对多个聚合执行操作,只需在命令中提供每个聚合的ID(客户端将从查询端获取),然后从存储库获取每个聚合。
然而,看看你对另一个答案的回应中的一个评论,我看到你实际上指的是基于集的验证。
这个问题引起了很多关于如何做到这一点的争论,Greg Young已经就此写了一篇博客文章。
经典的问题是'我如何检查用户名还没有被使用时处理我的'CreateUserCommand'。我认为建议的方法是假设客户端在发出命令之前已经通过询问查询端完成了此检查。当用户聚合被创建时,UserCreatedEvent将被引发并由查询端处理。在这里,插入查询将失败(由于检查或数据库中的唯一约束),并且将发出一个补偿命令,该命令将删除新创建的聚合,并可能通过电子邮件告诉用户用户名已经被占用。
要点是,您假设客户端已经完成了检查。我知道这种方法一开始很难理解,但这是最终一致性的本质。
你也可以读一读另一个类似的问题,其中包含了Udi Dahan的一些明智的话语。
在经典的事件溯源模型中,诸如获取所有客户之类的查询将由一个单独的查询处理程序执行,该处理程序侦听域中的所有事件并构建查询模型以满足相关问题。
如果您需要按姓氏查询客户,例如,您可以监听所有已创建的客户和客户姓名更改事件,并且只需将姓氏的一个表更新为客户-id对。您可以保留与显示数据的UI相关的其他信息,或者您可以简单地保留id并转到相关客户的存储库,以便进一步使用它们。
处理程序中不需要客户列表。每个聚合必须在自己的事务中处理。如果你想把这个列表显示给用户,只需构建合适的视图。
您的命令需要包含它应该操作的聚合根的id。该id将由使用readmodel中的视图发送命令的客户端查找。这个视图将用AR发出的事件中的数据填充。