Events CQRS/事件来源-瞬态事件

Events CQRS/事件来源-瞬态事件,events,domain-driven-design,projection,cqrs,event-sourcing,Events,Domain Driven Design,Projection,Cqrs,Event Sourcing,在开发应用程序的过程中,我发现我需要发出一些实际上不会修改聚合状态的事件,但它们是更新读取模型(瞬态事件?)所必需的。e、 g.如果在我的代码(域模型)中,我持有层中数字层次结构的状态,如: 1 4 7 5 8 3 9 read模型对事件进行投影,如(从左到右的顶部数字): 然后,当我在聚合根RemovedNumber(1)中触发事件时,如果这是我触发的唯一事件(因为它足以更新聚合状态),read model将不知道它需要将数字1替换为4 ? <---

在开发应用程序的过程中,我发现我需要发出一些实际上不会修改聚合状态的事件,但它们是更新读取模型(瞬态事件?)所必需的。e、 g.如果在我的代码(域模型)中,我持有层中数字层次结构的状态,如:

1    4    7
     5    8
3    9
read模型对事件进行投影,如(从左到右的顶部数字):

然后,当我在聚合根
RemovedNumber(1)
中触发事件时,如果这是我触发的唯一事件(因为它足以更新聚合状态),read model将不知道它需要将数字1替换为4

? <--- SHOULD BE 4 SINCE 4 IS UNDER 1
5
3
事件
RemovedNumber(1)
应保存在事件存储中,因为它会影响聚合的内部状态。事件
NowShowNumber(4而不是1)
也应该存储在事件存储中,因为它会影响读取模型(并且应该在重新投影时重播),但在从事件流重建聚合根时可能不应该使用它


这是CQRS/活动采购系统的标准实践吗?是否有其他解决方案?

为什么
读取模型不知道显示数字
4
? 聚合是否在
AddNumber(1)
之前发出了
AddNumber(4)
? 然后,
readmodel
在其部分复制了必要的状态,基本上是一个带有数字的堆栈,以便提取之前的数字并显示它

在CQR中,为了帮助
读取模型
,当状态改变并且发出
事件
时,
聚合
还包括
事件
中先前状态的位


在您的情况下,发出的
事件
可能具有以下签名
RemovedNumber(RemovedNumber,然后是NewCurrentNumber)
,特别是
RemovedNumber(1,4)

为什么
读取模型
不知道显示数字
4
? 聚合是否在
AddNumber(1)
之前发出了
AddNumber(4)
? 然后,
readmodel
在其部分复制了必要的状态,基本上是一个带有数字的堆栈,以便提取之前的数字并显示它

在CQR中,为了帮助
读取模型
,当状态改变并且发出
事件
时,
聚合
还包括
事件
中先前状态的位


在您的情况下,发出的
事件
可能具有以下签名
RemovedNumber(RemovedNumber,theNewCurrentNumber)
,特别是
RemovedNumber(1,4)
,我调用这些事件
带外
事件,并将它们保存到与我使用的流不同的流中。 没有听到其他人这样做,但没有听到任何好的理由不这样做-特别是如果你有一个合法的理由发布事件,没有任何影响的总和

在您的情况下,如果我足够了解您的问题,我将让域编写一个
TopLevelNumberChanged
事件,读取模型将看到并处理该事件。
很明显,它在水合时不会读取该事件。

我将这些事件称为带外事件,并将它们保存到与我水合骨料不同的流中。 没有听到其他人这样做,但没有听到任何好的理由不这样做-特别是如果你有一个合法的理由发布事件,没有任何影响的总和

在您的情况下,如果我足够了解您的问题,我将让域编写一个
TopLevelNumberChanged
事件,读取模型将看到并处理该事件。
很明显,当你补充水分时,它不会读到这个事件。

我看不出这是一个没有影响你的预测变化的事件的问题。根据投影,投影可能会忽略许多事件

这就是说,如果你说这两个事件是同时发生的,你可能需要重新审视一下设计/意图。你怎么知道调用第二个命令?一个命令可能不会奏效吗?事件可能会返回全部更改:

NumberReplacedEvent ReplaceNumber(1, 4);
事件将包含以下所有状态:

public class NumberReplacedEvent
{
    int ReplacedNumber { get; set; }
    int WithNumber { get; set;
}

我看不出这是一个完全不影响你的预测变化的事件。根据投影,投影可能会忽略许多事件

这就是说,如果你说这两个事件是同时发生的,你可能需要重新审视一下设计/意图。你怎么知道调用第二个命令?一个命令可能不会奏效吗?事件可能会返回全部更改:

NumberReplacedEvent ReplaceNumber(1, 4);
事件将包含以下所有状态:

public class NumberReplacedEvent
{
    int ReplacedNumber { get; set; }
    int WithNumber { get; set;
}

根据我的理解,没有单一的正确答案。CQRS/事件源只是一个帮助您建模数据流的工具。但它仍然是您的数据、业务规则和用例。换句话说:其他一些公司可以使用完全相同的数据模型,但有不同的事件结构,因为它更适合他们的用例

例如: 让我们想象一下,我们有一个网上商店。每次客户购买产品时,我们都会降低该产品的
inStock
值。如果客户退回产品,我们会增加价值

命令非常简单:
buydroduct(id:“123”,amount:4)

对于结果事件,我们有(至少)2个选项:

  • 购买的产品(id:“123”,金额:4)
    (增量值)
  • ProductBuyed(id:“123”,newInStockValue:996)
    (新总值)
  • (您还可以发布4次简单的
    ProductBuyed(id:“123”)
    事件)

    或者,您可以同时拥有多个结果事件:

    • ProductBuyed(id:“123”,金额:4)
    • InStockValueForProductChanged(id:“123”,新)