Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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 事件源与重构逻辑_Domain Driven Design_Cqrs_Event Sourcing - Fatal编程技术网

Domain driven design 事件源与重构逻辑

Domain driven design 事件源与重构逻辑,domain-driven-design,cqrs,event-sourcing,Domain Driven Design,Cqrs,Event Sourcing,我不熟悉事件源,对从事件流重建对象有点困惑 我相信我们需要按时间顺序加载所有发生的事件来重建对象状态。比如说 如果我有一个名为customer的对象 Public class Customer { public void Correctname(string firstName,string lastName) { CustomerNameChanged(new nameChangedEvent(firstName,lastName); } } 如果客户更

我不熟悉事件源,对从事件流重建对象有点困惑

我相信我们需要按时间顺序加载所有发生的事件来重建对象状态。比如说

如果我有一个名为customer的对象

Public class Customer
{
   public void Correctname(string firstName,string lastName)
    {
        CustomerNameChanged(new nameChangedEvent(firstName,lastName);
    }
}

如果客户更改了两次名称,我们将在事件日志中存储两次事件,当我将事件重新生成到对象时,我将获得两次事件。是否需要获取上一个事件或归档事件,以便我们不再重新运行上一个事件

您将对客户对象重新应用这两个事件。因为您按时间顺序应用它们,所以Customer对象将处于正确的当前状态。如果您担心所应用的不再代表当前状态的事件的数量,您应该查看

您将对客户对象重新应用这两个事件。因为您按时间顺序应用它们,所以Customer对象将处于正确的当前状态。如果您担心应用的不再代表当前状态的事件数量,则在重建对象时,您应该查看该对象的整个事件流。就性能而言,这通常不是一个问题,即使对于大量事件也是如此。您可以通过使用


使用快照,可以在事件流的特定点存储对象的状态。重建只是加载快照+快照拍摄后发生的事件。

重建对象时,处理该对象的整个事件流。就性能而言,这通常不是一个问题,即使对于大量事件也是如此。您可以通过使用


使用快照,可以在事件流的特定点存储对象的状态。重建只是加载快照+快照拍摄后发生的事件。

,实际上,当重建对象时,我认为第二个事件没有用处,我也没有遗漏什么,那么为什么我们不能从顶部获取唯一的事件并重新应用它呢。仅当我们需要在特定时间将对象置于当前状态时,才需要剩余的事件。您可以说仅获取最新的“CustomerNameged”事件。这可能适用于在域逻辑方面毫无意义的名称更改,但这种方法不适用于“AccountBalanceIncreased”之类的事件。这里需要先前的事件,以便实体返回其当前状态;大多数情况下都是这样。此外,如果要尝试过滤掉最近的事件,则必须为每个实体的事件添加查询逻辑,这将是一个很大的难题。如果性能让你担心,那么你最好做快照。谢谢@david。这完全有道理。但是,对于帐户余额增加,快照将如何显示,它将计算到当前为止的金额并作为快照保留帐户余额,对象将具有“余额”属性,该属性将在每次应用AccountBalanceIncremented事件时递增。在X个事件量之后,您可以创建一个快照对象,它只是一个表示整个对象当前状态的数据对象,并将余额属性从实体复制到快照对象,并将其保存在数据库中。其思想是,在获取对象时,首先查找最新的快照,然后应用该快照之后发生的任何事件。如果您的对象具有很长的生命周期,并且有许多事件,那么很有用。事实上,当重建对象时,第二个事件在我看来并不有用,或者我遗漏了一些东西,那么为什么我们不能从顶部获取唯一的事件并重新应用它呢。仅当我们需要在特定时间将对象置于当前状态时,才需要剩余的事件。您可以说仅获取最新的“CustomerNameged”事件。这可能适用于在域逻辑方面毫无意义的名称更改,但这种方法不适用于“AccountBalanceIncreased”之类的事件。这里需要先前的事件,以便实体返回其当前状态;大多数情况下都是这样。此外,如果要尝试过滤掉最近的事件,则必须为每个实体的事件添加查询逻辑,这将是一个很大的难题。如果性能让你担心,那么你最好做快照。谢谢@david。这完全有道理。但是,对于帐户余额增加,快照将如何显示,它将计算到当前为止的金额并作为快照保留帐户余额,对象将具有“余额”属性,该属性将在每次应用AccountBalanceIncremented事件时递增。在X个事件量之后,您可以创建一个快照对象,它只是一个表示整个对象当前状态的数据对象,并从ent复制Balance属性
复制快照对象并将其保存在数据库中。其思想是,在获取对象时,首先查找最新的快照,然后应用该快照之后发生的任何事件。如果对象的生命周期较长且有许多事件,则此选项非常有用。重播期间从流中忽略事件的危险在于,您所做的假设仅适用于对象模型的当前版本。事情往往会发生变化……重播过程中忽略流中事件的危险在于,您所做的假设仅适用于对象模型的当前版本。事情往往会改变。。。