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

本文关键字:结构 检索 历史事件 事件 | 更新日期: 2023-09-27 18:22:41

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

  • AggregateId:integer
  • 有效负载:blob
  • 版本:integer

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

public class OrderLineAdded
{
    int Id;
    short Quantity;
}

然后添加具有更新结构的其他事件:

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

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

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

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

Rinat Abdullin在他的CQRS bliki中概述了一些领域事件版本控制策略,您可能会发现这些策略很有用。

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

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

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

我看到的处理向后兼容性的唯一方法是对事件的每个更改进行版本化。有些人在不同的命名空间中创建新版本,以便命名空间反映版本/功能信息:

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

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

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

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