Domain driven design CQR(事件源)读取多个聚合

Domain driven design CQR(事件源)读取多个聚合,domain-driven-design,cqrs,event-sourcing,event-driven-design,Domain Driven Design,Cqrs,Event Sourcing,Event Driven Design,我有两个聚合,它们有一对多的关系。例如,我有一个问题列表,我想将其中一些问题添加到问题列表中,其中一些是强制性的,必须添加到所有问题列表中,而其中一些不是,并且问题列表的创建者选择了它们 假设我正在使用事件源和CQR。我创建了一个问题列表,我想将强制性问题添加到问卷中。 通常我会这样做 questionaire.AssignQuestions(questions.Where(q => q.isMandatory).Select(q => q.Id)) 类似的东西。但是在CQRS中,

我有两个聚合,它们有一对多的关系。例如,我有一个问题列表,我想将其中一些问题添加到问题列表中,其中一些是强制性的,必须添加到所有问题列表中,而其中一些不是,并且问题列表的创建者选择了它们

假设我正在使用事件源和CQR。我创建了一个问题列表,我想将强制性问题添加到问卷中。 通常我会这样做

questionaire.AssignQuestions(questions.Where(q => q.isMandatory).Select(q => q.Id))
类似的东西。但是在CQRS中,我不应该使用查询模型来实现这一点。但在命令模型中,我使用的是事件存储,因此我必须重播所有问题上的所有事件,这似乎不合理

很可能我的模型不够面向事件,但在这一点上我没有更好的想法。我应该如何建模


谢谢

您的命令处理程序可以查询阅读模型以检索问题ID列表以形成问卷

但是在CQRS中,我不应该使用查询模型来实现这一点


这只是一个错误的神话

谢谢你的回答,从我听到的到目前为止,命令和查询可能在不同的微服务中。如果是,则从命令处理程序访问读取模型的唯一方法是通过web api。在命令端读取“读取模型”的问题在于,只有聚合中包含的数据是一致的,每次需要使用/读取命令聚合所有者之外的数据时,您不能相信它们是最新版本。基本上你有两种方法来解决这个问题:1。展开聚合边界,使其包含执行命令所需的所有数据。2.查询聚合外部的数据并“容忍”它们可能过时的事实似乎您处于一种可以“容忍”过时数据的情况,同时扩展聚合边界将在应用程序中创建大锁(关于这一点,我在另一个问题中做了更好的解释)@rascio是对的,但我要补充的是,从写模型查询读模型可能会带来最终的一致性问题\竞争条件。它可能只是好的,也可能不是。请注意这个事实。@Skleanthu是的,你是对的!这就是我对容忍陈旧数据的意思。添加强制性问题是用户行为还是在问卷生命周期的某个时间点发生的规则?如果是,在哪个状态转换期间发生?