Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design CQRS+;事件来源。更改聚合根历史记录_Domain Driven Design_Cqrs_Event Sourcing - Fatal编程技术网

Domain driven design CQRS+;事件来源。更改聚合根历史记录

Domain driven design CQRS+;事件来源。更改聚合根历史记录,domain-driven-design,cqrs,event-sourcing,Domain Driven Design,Cqrs,Event Sourcing,我有以下问题。 鉴于CQRS+EventSourcing应用程序。 这如何可能改变历史中聚合根的状态 例如,会计应用程序,会计人员希望应用交易,但日期已过。将存储在事件存储中的事件的日期将比最近的事件的日期早,但此事件的序列号将更大 存储库将通过按序列号排序事件来恢复聚合根的状态。如果我们将为过去的这个日期拍摄快照,那么我们将拥有聚合根,而没有此事件 我们当然可以将存储库的逻辑更改为按日期排序事件,但我们使用外部框架进行CQR,这是不可取的 对于这种情况,有一些优雅的解决方案吗?您已经声明,您的

我有以下问题。 鉴于CQRS+EventSourcing应用程序。 这如何可能改变历史中聚合根的状态

例如,会计应用程序,会计人员希望应用交易,但日期已过。将存储在事件存储中的事件的日期将比最近的事件的日期早,但此事件的序列号将更大

存储库将通过按序列号排序事件来恢复聚合根的状态。如果我们将为过去的这个日期拍摄快照,那么我们将拥有聚合根,而没有此事件

我们当然可以将存储库的逻辑更改为按日期排序事件,但我们使用外部框架进行CQR,这是不可取的


对于这种情况,有一些优雅的解决方案吗?

您已经声明,您的业务逻辑允许您添加一个过时的事务;现在我不知道你为什么想要它,但是没有什么约束你的聚合不接受它。当然,事件将获得更晚的事件序列号/版本,但这是意料之中的


您不需要摆弄基础设施、存储库或其他任何东西来完成这项工作。

会计不允许您更改历史记录。它只允许您添加条目。根据您的业务逻辑来解释这些事件的日期。在这种情况下,事件序列不仅仅是事件源的持久性技巧,而是域的实际内容

在会计方面,如果你改变过去的预订,你可能会进监狱。不要改变过去。改用补偿命令

很抱歉,但是您提到了会计示例,这可能是一个非常严格地处理过去数据而不明确更改的领域

如果上述内容不适用于您的域,您可以轻松地在旧事件的基础上应用新事件,以更改域对象的状态(可能还有历史记录)


以预订一个账户为例。事件可能发生在今天,但它可以将实际预订日期设置为过去的某个时间。

解决此问题的一个方法是将事件视为明确的补偿操作。例如,当您的银行撤销收费时,他们不会删除现有交易,而是添加补偿交易。本交易可参考其希望通过各自日期进行补偿的交易。通过这种方式,事件是现实的恰当表示。

您所寻找的是一个双时态实现

e、 在12月3日,我们认为X==12(截至),但在12月5日,我们纠正了错误,现在知道12月3日X==14(截至)

有两种方法可以实现这一点

1) 事件存储保存as-at数据,投影保存as-of数据(可能的变化包括as-of和as-at投影)

2) 聚合有一个重载方法,指示需要从事件存储中获取as-of-vs-as-at值。这很可能涉及使用自定义的辅助快照流作为数据值

您的解决方案很可能同时使用这两种实现,因为一种是以命令为中心的,另一种是以查询为中心的

第二个选项中聚合根目录的as of快照需要在收到纠正事件时重建

马丁·福勒在这篇文章中谈到了这一点

注意:事件存储仍然是仅附加的