2016-08-18 293 views
2

我有以下型号:最佳实践

public class Team { 
    public Guid Id {get; set;} 
    public string Name {get; set;} 
    public string League {get; get;} 
    public int Rating {get; set;} 
} 

在创建新的团队在系统中,我发布事件:TeamCreated到服务总线:

{ 
    "MessageId": "33909eaf-56a1-4467-a01a-64b94f10490c" 
    "MessageType": "TeamCreated", 
    "CreationDate": "20-01-2016", 
    "Payload": { 
     "Id": "11111www-56a1-4467-a01a-64b94f000111", 
     "Name": "Toronto Maple Leafs", 
     "League": "NHL NorthEast", 
     "Rating": 100 
    } 
} 

该条目已修改为以下内容:

{ 
    "MessageId": "33909eaf-56a1-4467-a01a-64b94f10490c" 
    "MessageType": "TeamUpdated", 
    "CreationDate": "20-01-2016", 
    "Payload": { 
     "Id": "11111www-56a1-4467-a01a-64b94f000111", 
     "Name": "Toronto Maple Leafs", 
     "League": "NHL NorthEast", 
     "Rating": 50 
    } 
} 

正如你所看到的,他是你pdated消息仍然保留所有属性的值,而不仅仅是作为团队评级的已更改属性。

我的模型在实际系统中有超过50个属性,我不想在每个属性更新时创建单独的事件。特别是因为可能会在一次更新中更改多个属性。

在事件源代码架构中,此场景是否存在定义的模式?

回答

8

通常的答案是放弃CRUD事件,而是使用无处不在的语言来描述更改。

在某种程度上,这只是一个脱钩练习;我们试图描述“发生了什么”,而不是像我们今天所实施的实体状态那样投入过多。

要选择一个示例;假设'叶子移动到拉斯维加斯;我们如何用无处不在的语言来描述?我们可能会说,球队搬迁(改变家居城,体育馆),重新调整(改变联赛),并可能更名(更换队名,标志),可能出售(改变所有权组)。因此,我们希望将这些数据打包成一个TeamUpdated事件,而不是将这些数据打包成多个事件,并将逻辑分组数据共享相应的事件。

当您对实体进行补水时,它负责识别事件负载中的数据,并了解它如何更改自己的(私有)状态以反映先前记录的历史记录。

+0

很好解释。 – plalx

+0

+1。如果您的ThingUpdated事件有超过50个属性,那么您绝对需要将其分解为已发生的域事件 – tomliversidge