gpt4 book ai didi

design-patterns - 聚合内部的实体能否在聚合外部访问或可见?

转载 作者:行者123 更新时间:2023-12-01 12:09:03 26 4
gpt4 key购买 nike

我是 DDD 的新手,我的问题对你们中的许多人来说似乎微不足道。

考虑学生和类(class)的情况。

只有当学生的年龄超过注册该类(class)所需的最低年龄时,学生才能注册该类(class)。

在我看来,Student 和 Course 可以被视为聚合,其中 Student 是根实体,Course 是子实体,age 是不变量。

Student 应该有一个方法 Student.SubscribeTo(Course course) 并且该方法应该强制执行不变量 Student.Age >= Course.MinAge否则产生异常。

这在 DDD 方法中是否正确?或者我应该只传递给 SubscribeTo CourseId 吗? Student.SubscribeTo(int CourseId)

在我看来,如果没有办法打破不变量,则应该允许从聚合外部访问 Course。如果我在代码的其他一些地方更改 Course.MinAge,我不会破坏我的业务需求,因为我希望只有在订阅类(class)时才尊重年龄,我不介意以后 Course.MinAge 发生变化。

如果业务需求声明不同情况:当 Course.MinAge 更改时,已经注册该类(class)的学生应该从类(class)中删除,如果 Student.Age < Course.MinAge .

最佳答案

我认为您的汇总不正确。 Course 实体可以独立存在,它不是 Student 实体的子实体。类(class)有自己的生命周期:例如如果学生离开学校,类(class)将继续存在。类(class) ID 不依赖于学生 ID。学生可以持有类(class)ID,但它们是不同的集合。

无论如何,对于将类(class) ID 传递给“student.subscribeTo”方法(如果它们是聚合)的问题,答案是否定的,您不能将子实体的 id 传递给聚合操作,因为子实体没有聚合外部已知的全局身份。他们将本地 ID 放入聚合中。

更新:

由于类(class)和学生是两个集合,因此“学生的年龄必须高于注册类(class)所需的最低年龄”这一规则不是不变的。为什么?因为不变量是关于聚合状态的业务规则,所以它必须始终在事务上保持一致。聚合定义事务一致性边界。

因此,该规则只是学生订阅类(class)时必须检查的验证规则(“student.subscribeTo”方法)。由于聚合不应该使用存储库,您可以将域服务传递给该方法,学生聚合将双重分派(dispatch)到域服务,以便从类(class) ID 获取类(class)。

查看 Vaughn Vernon 的红皮书 IDDD 的聚合章节(第 361-363 页)或同一作者的文章:

http://www.informit.com/articles/article.aspx?p=2020371&seqNum=4

希望对您有所帮助。

关于design-patterns - 聚合内部的实体能否在聚合外部访问或可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53866617/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com