Domain driven design 发布实体状态更改的最佳做法

Domain driven design 发布实体状态更改的最佳做法,domain-driven-design,cqrs,event-sourcing,Domain Driven Design,Cqrs,Event Sourcing,我有以下型号: 公共类团队{ 公共Guid Id{get;set;} 公共字符串名称{get;set;} 公共字符串联盟{get;get;} 公共整数评级{get;set;} } 在系统中创建新团队后,我将事件:TeamCreated发布到服务总线: { “消息ID”:“33909eaf-56a1-4467-a01a-64b94f10490c” “消息类型”:“团队已创建”, “创建日期”:“20-01-2016”, “有效载荷”:{ “Id”:“11111 www-56a1-4467-a01

我有以下型号:

公共类团队{
公共Guid Id{get;set;}
公共字符串名称{get;set;}
公共字符串联盟{get;get;}
公共整数评级{get;set;}
}
在系统中创建新团队后,我将事件:
TeamCreated
发布到服务总线:

{
“消息ID”:“33909eaf-56a1-4467-a01a-64b94f10490c”
“消息类型”:“团队已创建”,
“创建日期”:“20-01-2016”,
“有效载荷”:{
“Id”:“11111 www-56a1-4467-a01a-64b94f000111”,
“名称”:“多伦多枫叶”,
“联盟”:“NHL东北部”,
“评级”:100
}
}
下一步,因为此条目已修改为以下内容:

{
“消息ID”:“33909eaf-56a1-4467-a01a-64b94f10490c”
“消息类型”:“团队更新”,
“创建日期”:“20-01-2016”,
“有效载荷”:{
“Id”:“11111 www-56a1-4467-a01a-64b94f000111”,
“名称”:“多伦多枫叶”,
“联盟”:“NHL东北部”,
“评级”:50
}
}
正如您所看到的,更新消息仍然保存所有属性的值,而不仅仅是更改的属性,即团队的评级

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


在事件源架构中是否定义了此场景的模式?

通常的答案是放弃CRUD事件,而是使用通用语言描述更改

在某种程度上,这只是一种脱钩行为;我们试图描述“发生了什么”,而不是像我们今天碰巧实现实体状态的方式那样投入太多

选择一个例子;假设叶一家要搬到维加斯去;我们如何用无所不在的语言来描述这一点?我们可能会说球队搬迁了(改变了主场城市、体育场),重新调整了(改变了联赛),可能重新命名了(改变了球队名称、标志),可能卖掉了(改变了所有权群体)。因此,我们不希望将这些数据打包到一个
TeamUpdated
事件中,而是希望看到将更改表示为多个事件,逻辑分组的数据共享相应的事件


当您将实体重新水化时,它负责识别事件有效负载中的数据,并了解它如何改变自身(私有)状态以反映以前记录的历史。

对此进行了很好的解释。+1。如果您有50多个属性将用于ThingUpdate事件,那么您绝对需要将其拆分为已发生的域事件