【发布时间】:2013-05-13 11:27:36
【问题描述】:
我们正处于开发周期 (asp.net mvc applciation) 的某个阶段,我们需要对现有命令和事件进行更改(例如添加/删除一些属性等)。
我一直在尝试找到一种在系统中引入命令/事件版本控制的方法。我已经阅读了很多关于 google/stackoverflow 等的帖子,但我仍然看到了一个实现它的代码示例。版本控制时是否应遵循推荐的模式。如果是,有任何示例/sn-ps?
编辑:这就是我在这方面取得的进展
- 我已经对我的事件进行了向后版本化,这样最新的事件将始终被称为相同,而过时的事件将添加一个后缀,如“_V1”、“_V2”等。
如果我有活动
public class OrderSubmittedEvent : IDomainEvent
{
public int OrderId { get; private set; }
public OrderSubmittedEvent(int orderId)
{
OrderId = orderId;
}
}
如果我必须添加一些属性,我将上面的事件重命名为
public class OrderSubmittedEvent_V1 : IDomainEvent
{
public int OrderId { get; private set; }
public OrderSubmittedEvent_V1(int orderId)
{
OrderId = orderId;
}
}
并引入另一个与我的原始事件同名但添加了属性的事件,就像这样
public class OrderSubmittedEvent : IDomainEvent
{
public int OrderId { get; private set; }
public OrderSubmittedEvent(int version = 1, int orderId = 0, string customerName =
"Joe blogs", string address = "Earth")
{
OrderId = orderId;
CustomerName = customerName;
Address = address;
CurrentVersion = version;
}
public static int LatestVersion
{
get { return 2; }
}
public int CurrentVersion { get; set; }
public string CustomerName { get; set; }
public string Address { get; set; }
}
我仍然需要继续更改发布此事件的代码以包含新属性的值。
- 任何给定时间点,当我从事件存储中获取所有事件(例如,用于重播)时,它们在反序列化后(在本例中为 OrderSubmittedEvent)将始终具有相同类型,并且具有不属于旧属性的新属性使用其默认值填充的事件。
在重播我的事件时,我让我的事件通过 IEventUpgrader 这首先验证事件是否是可用的最新版本。由于类型始终是事件类型,因此此检查基于属性“LatestVersion”和“CurrentVersion”
大家如何看待这种方法?
下一个待办事项
- 如果事件是旧版本,则发布“UpdateMYEVENT”事件
谢谢
【问题讨论】:
-
您使用的是事件溯源还是仅使用消息驱动的 CQRS?
-
@MikeSW - 只是消息驱动的 CQRS
标签: events domain-driven-design versioning cqrs