【发布时间】:2024-04-12 10:40:01
【问题描述】:
阅读越来越多的聚合根,特别是来自 Vaughn Vernon 的 I-DDD,我提出了一个关于并发的问题。
多个用户同时访问一个系统。 (当前)核心域是关于教育中心的“注册”,因此有一个 Student 实体代表企业的主要客户。 Student 是一个聚合根,当然有很多信息。
假设Student 有一个PersonalAddress 和AcademicInformation(过去的学校、成绩等),它们都被建模为聚合 内的值对象 ,并且-为了论证-在同一个Aggregate中没有其他Entity。 Student Aggregate 在 Entity 中使用类似于版本属性的乐观并发,因此对其数据的任何更改都会增加该版本。
问题是,如果两个不同的用户同时尝试修改同一个Student 的PersonalAddress 和AcademicInformation,其中一个尝试将失败,即使地址和学术信息完全不相关;虽然两者都是VO,但它们属于同一个聚合。
我认为我可以拆分 聚合 以避免并发冲突,因为除了“属于”同一个 Student 之外,没有与 PersonalAddress 和 AcademicInformation 相关的真正不变量。但这些都是VO,没有自己的身份。我必须创建另一个 Entity 并将它们放在不同的 Aggregate Roots 中,两者都包含与同一学生相关的信息,因此可以同时修改这些信息。
所以问题是:
- 如何避免修改被建模为值对象(
PersonalAddress,AcademicInformation)的同一实体(Student)的无关信息的并发冲突)? - 正如我之前解释的那样,将
Student聚合拆分成两个或更多不同的聚合根是一种“好方法”吗? - 即使这种特殊情况可以通过其他方式解决(如果能分享,我将不胜感激),如何从更一般的角度解决这个问题?
我认为这一切都取决于用户尝试同时修改信息的频率,并据此决定拆分聚合是否值得……但我不知道。
非常感谢。
【问题讨论】:
标签: concurrency domain-driven-design aggregateroot