domain-driven-design - 插入和删除的不同聚合根
问题描述
想象一下,我们有以下内容aggregate root
:
public class Resource
{
public IEnumerable<Schedule> schedules {get;private set;}
...
}
当我们想添加一个新的时schedule
,我们需要确保它不会与现有的冲突。这转化为aggregate root
确保方法上的此不变量resource.AddSchedule(schedule)
。
另一方面,删除 aschedule
没有不变量。如果我们使用Resource aggregate root
删除一个schedule
,我们需要预先加载所有schedules
删除一个。
基于此,我们是否应该将 提升Schedule
为aggregate root
,只加载schedule
我们需要的然后删除它?还是我们应该继续使用以前的aggregate root
?
解决方案
当我们想要添加一个新的时间表时,我们需要确保它不会与现有的时间表发生冲突。
您在此处尝试实现的通用术语是set validation。
如果您需要绝对保证集合中没有冲突条目,有时称为“立即一致性”,那么您必须保证条目不会与您的检查同时更改。这意味着您在检查中关心的值必须是检查它们的汇总的一部分——我们需要确保答案在我们下面不会改变。
更常见的情况是“尽力而为”就足够了,并且有一些协议可用于解决从裂缝中溜走的冲突。在这种情况下,您通常可以将集合视为标识符列表,而不是值列表。因此,详细信息可以保存在 Schedule 聚合中,而 Resource 聚合仅跟踪计划成员资格。
还有一个额外的极端情况——如果时间表是值而不是实体......意味着给定时间表的细节是不可变的,那么你也许可以吃蛋糕并吃掉它——为每个时间表计算一个唯一的哈希,并且将散列值存储在 Resource 中,以后可以在必要时用于查找不可变调度。
这里的很大一部分工作是正确获取业务需求的细节。在大多数成熟的业务领域中,冲突经常发生,以至于有解决它们的协议。换句话说,竞争条件不存在。
时间上的微秒差异不应该对核心业务行为产生影响。
推荐阅读
- rust - 相互交织的范围如何创建“数据竞赛”?
- angular - Angular 9:LocalStorage 未定义
- angular - Angular 9 <- 如何订阅 Observable 并显示其值
- c - c 进程间通信编译
- python - 如何遍历excel中的每个单元格以检查单元格是否包含日期,然后将日期转换为字符串
- c# - 将物理电话上的 Xamarin.forms 应用程序连接到 Asp.net REST API 时出现 StatusCode 400“错误请求”
- c++ - 类成员的动态分配和值
- excel - Excel 2013 中未定义 Eval
- pointers - 为什么我必须在取消引用之前复制字符串?
- python - 在 qTimeEdit 中找不到 valueChanged