我们正处于开发周期(asp.net mvc applciation)的某个阶段,我们需要对现有命令和事件进行更改(比如添加/删除一些属性等)。
我一直在尝试找到一种在系统中引入命令/事件版本控制的方法。我已经阅读了很多关于 google/stackoverflow 等的帖子,但我仍然看到了一个实现它的代码示例。版本控制时是否应遵循推荐的模式。如果是的话,有任何例子/片段吗?
编辑:这就是我在这方面取得的进展
- 我已经对我的事件进行了版本化,这样最新的事件总是被称为相同的,而过时的事件将添加一个后缀,如“_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”事件
谢谢