Aff*_*tus 2 domain-driven-design cqrs event-sourcing
我有以下型号:
public class Team {
public Guid Id {get; set;}
public string Name {get; set;}
public string League {get; get;}
public int Rating {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
在系统中创建新团队后,我将事件发布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
}
}
Run Code Online (Sandbox Code Playgroud)
接下来,此条目已修改为以下内容:
{
"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
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,他更新的消息仍保留所有属性的值,而不仅仅是已更改的属性,即团队的等级.
我的模型,在真实系统中有超过50个属性,我不希望在每个属性更新时为它们创建单独的事件.特别是因为可能是在一次更新中更改了多个属性的情况.
在事件采购架构中是否存在针对此场景的已定义模式?
通常的答案是放弃CRUD事件,而是使用普遍存在的语言来描述变化.
在某种程度上,这只是一种脱钩运动; 我们试图描述"发生了什么",而不是过多地投资于我们今天实现实体状态的方式.
选择一个例子; 假设'叶子要搬到拉斯维加斯; 我们如何用无处不在的语言描述它?我们可能会说团队搬迁(改变家乡城市,体育场),重新调整(改变联盟),并可能重新命名(更改团队名称,徽标),可能出售(更改所有权组).因此TeamUpdated,我们不希望将这些数据打包到一个事件中,而是将更改表示为多个事件,逻辑分组的数据共享适当的事件.
当您对实体进行补充水分时,它负责识别事件有效负载中的数据,并了解它如何更改其自身(私有)状态以反映先前记录的历史记录.
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |