Architecture 不';使用域事件更新读取模型复制业务逻辑?

Architecture 不';使用域事件更新读取模型复制业务逻辑?,architecture,domain-driven-design,cqrs,event-sourcing,Architecture,Domain Driven Design,Cqrs,Event Sourcing,我目前正在考虑域事件的粒度。据我所知,从命令到域事件的1:1关系开始是一个好模式,这样域事件就可以表达用户所做的事情 在我的例子中,有一个旅程(火车或公共汽车)由一系列的站点组成。每一个停止都有一个时间戳,它将在何时发生。现在,用户可以取消此行程,这将导致从行程的站点删除(简化)所有时间戳 我要做的是发出一个“JourneyCancelled”事件 现在,如果有一个read模型为旅程提供一个站点列表,那么read模型将如何处理这个事件?它可能还会重置旅程每一站的时间戳,这意味着它复制了那里的逻辑

我目前正在考虑域事件的粒度。据我所知,从命令到域事件的1:1关系开始是一个好模式,这样域事件就可以表达用户所做的事情

在我的例子中,有一个旅程(火车或公共汽车)由一系列的站点组成。每一个停止都有一个时间戳,它将在何时发生。现在,用户可以取消此行程,这将导致从行程的站点删除(简化)所有时间戳

我要做的是发出一个“JourneyCancelled”事件

现在,如果有一个read模型为旅程提供一个站点列表,那么read模型将如何处理这个事件?它可能还会重置旅程每一站的时间戳,这意味着它复制了那里的逻辑(以及处理此事件的所有其他读取模型)

我对旅行被取消的事实感兴趣,但我也对发生的细节感兴趣

关于域事件,我做错了什么

罗尼

现在,用户可以取消此旅程,从而从旅程事件中删除(简化)所有时间戳

事件应该是不可变的,您不应该基于后续事件从事件中删除数据

现在,如果有一个read模型为旅程提供一个站点列表,那么read模型将如何处理这个事件?它可能还会重置旅程每一站的时间戳

这种阅读模式是干什么用的?你想回答什么问题?业务是否需要一个读取模型来显示行程中所有预测的站点,还是一个
JourneyCompleted
事件更合适?(或更细粒度的
legcompled
事件)

它是否需要知道哪些行程随后被取消,但要保持预测的站点

一种方法是将事件进一步分解,如上所述:

  • 行程已开始
    (可能包括所有预测的站点)
  • legcompled
    (站点名称/id、时间戳等)
  • legcompled
  • JourneyCompleted

  • journeystart
  • legcompled
  • JourneyCancelled
等等

我不清楚你在读写方面想做什么。阅读模型通常是数据的聚合,旨在回答以下问题:

  • “在过去的一个小时里取消了多少次?”
  • “取消预订最常见的原因是什么?”
  • “行程长度与取消百分比之间是否存在相关性?”
  • 等等

域的写端用于强制执行业务规则和不变量

虽然您将命令->事件作为起点是正确的,但到目前为止,这并不是一个教条。如果您查看任何事件源框架,它们总是假设域模型上的一个事务可能会返回事件列表

也就是说,一个命令可能会产生许多事件。这些事件中的每一个都可以投射到读取模型上的单个原子操作

在您的情况下,
cancelTourney
命令将生成一个
JourneyCancelled
加上多个
StopTimestampCleared
事件。因此,您的业务逻辑将在聚合方法中,并且您的预测将愚蠢到不包含该逻辑


记录导致聚合状态更改的任何事件非常重要。另外,尝试使
应用
方法尽可能小。在这种情况下,您将看到
JourneyCancelled
是与其他项目不同的项目。另外,非常重要的一点是,请记住
Apply
方法可能会随着时间的推移而变化,但您需要做好准备,每次读取聚合时,都会再次播放它们

记住这一点,现在站点中有隐式的状态更改,但确实需要使其更可见。通过为他们举办自己的活动,你肯定会改进你的模型。

据我所知,从命令到域事件的1:1关系开始是一个好模式,这样域事件就可以表达用户所做的事情

重新学习--1:1是常见的,因为许多命令只修改单个实体,不需要任何补偿操作,但它不是通用的。当用户提出更改时,通常需要多个事件来保持不变

您还需要注意“用户所做的事情”。如果您的消息描述的是用户(在现实世界中)所做的事情,那么该消息是一个事件,而不是命令。命令是用户要求模型做某事的命令(重要的试金石-是否允许模型说不?)

在我的例子中,有一个旅程(火车或公共汽车)由一系列的站点组成。每一个停止都有一个时间戳,它将在何时发生

请记住,“聚合”几乎总是信息资源——不是旅行者,而是旅行者档案。不是旅行,而是预定或行程

在这种情况下,“何时发生”意味着时间表或行程是一个概念,应该在模型中明确(还不清楚这是聚合的根还是聚合中的子实体)

您还需要考虑停止(我喜欢腿部,因为我在旅行软件中的工作)是值还是当前状态的实体

现在,用户可以取消此行程,这将导致从行程的站点删除(简化)所有时间戳

提示:在征求建模建议时,避免简化;好的建模需要理解约束

现在还不清楚为什么会这样