如何在更改域事件结构后检索历史事件

时间:2012-02-07 00:48:53

标签: c# cqrs event-sourcing

给定带有字段的事件存储:

  • AggregateId:integer
  • 有效载荷:blob
  • 版本:整数

其中包含基于以下内容的事件:

public class OrderLineAdded
{
    int Id;
    short Quantity;
}

...然后添加了更新结构的其他事件:

public class OrderLineAdded
{
    int ProductId; // field name has changed
    int Quantity; // field datatype has changed
}

当检索此历史数据(用于分析等)时,如何将二进制有效负载重建为有意义的数据?

注意:上面的代码不是一个好的事件/事件存储实现的示例。我只是想知道应如何处理这种情况。

2 个答案:

答案 0 :(得分:3)

Rinat Abdullin在他的CQRS bliki中概述了一些您可能会觉得有用的域事件版本控制策略。

https://abdullin.com/post/event-sourcing-versioning/

他提出了两种可能的方法:

  1. 使用可以自动处理事件中属性重命名的序列化程序,例如Google的ProtoBuf Serializer。
  2. 实施以下界面,自行手动升级内存中的事件。
  3. public interface IUpgradeDomainEvents
    {
        IEnumerable<IDomainEvent> Upgrade(IDomainEvent e, string id);
    }
    

答案 1 :(得分:1)

我见过处理向后兼容性的唯一方法是对事件的每次更改进行版本控制。有些人在不同的命名空间中创建新版本,因此命名空间反映了版本/功能信息:

namespace Foo.ProjectA.Release1
{
  public interface ISomeEvent {...}
}

namespace Foo.ProjectA.Release3
{
  public interface ISomeEvent {...}
}

或者,使用类名中的版本/功能信息创建该类的新版本:

namespace Foo.ProjectA
{
  public interface ISomeEvent {...}
  public interface ISomeEvent_MoreRefinedVersion {...}
}

就个人而言,我更喜欢前一种方法,除非新版本为事件添加了更具体的语义含义。