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