Reference DDD-对聚合外部实体的引用

Reference DDD-对聚合外部实体的引用,reference,entity,domain-driven-design,aggregateroot,Reference,Entity,Domain Driven Design,Aggregateroot,这是我在DDD的第一次尝试,我想得到关于建模问题的建议 这里是我的领域:多所学校的管理 一所学校有多名学生、教师… 对于一所学校来说,每年都有一个新学年,其价值目标为2017-2018年 班级、学生成绩与学年有关。例如,学生a在2017-2018学年可以在C1班,在2018-2019学年可以在C2班 我的第一个疑问是学年的建模 我已经将学校实体作为根集合。我的第一个方法是让学校集合处理学年的增加,这样我可以避免重复,或者我可以创建下一个学年 =>学年是学校总数的一部分 但后来我不得不对班级和学生

这是我在DDD的第一次尝试,我想得到关于建模问题的建议

这里是我的领域:多所学校的管理

一所学校有多名学生、教师… 对于一所学校来说,每年都有一个新学年,其价值目标为2017-2018年 班级、学生成绩与学年有关。例如,学生a在2017-2018学年可以在C1班,在2018-2019学年可以在C2班 我的第一个疑问是学年的建模

我已经将学校实体作为根集合。我的第一个方法是让学校集合处理学年的增加,这样我可以避免重复,或者我可以创建下一个学年

=>学年是学校总数的一部分

但后来我不得不对班级和学生成绩进行建模……这取决于学年

因此,在我的课堂上,我必须引用一个学年……这违反了规定

无法从外部聚合保留对内部实体的引用

在我的领域中,许多实体都依赖于特定的学年。也许它应该是一个集合

另一方面,给定班级的学年用于搜索班级

我能得到一些关于这个建模问题的建议吗

另一个问题是关于学年的身份

选项A:按原样生成UUID,并将schoolId+年份作为属性 选项B:Id是schoolId和year,因此我们不能为同一所学校和同一年创建两次同一学年 有什么建议吗


非常感谢帮助我进入DDD世界

为了回答你的问题,我不得不做一些假设。所以,也许我的回答并不能完全反映你的真实意图,但我已经尽可能地遵循你所描述的。因此,请对我的回答持保留态度

首先,引起我注意的是,您正在考虑一个对象模型。领域驱动的设计不是关于对象,而是关于过程。所以,当你把注意力集中在名词上时,我建议你把更多的注意力集中在动词上:在你的领域里会发生什么事情

在思考这个问题时,我越来越清楚地意识到,核心问题是课堂:是的,最初你需要建立一所学校,但一旦它建立起来,随着时间的推移,没有多少行动发生。也许它会被重命名,但就是这样

一学年也是如此。我的假设是,我不知道这是否适用于您的具体场景,例如,只有一个2017/2018学年适用于所有学校。也许这在你的场景中是不同的,因为不同的学校可以有不同的学年,但我假设它们总体上是相同的

此外,还有老师和学生,这也是非常简单的事情

这就给我们留下了上课的机会。最初,课程是为特定的学校和特定的学年设置的。然后你给它分配一个老师,我假设每个班只有一个老师,我也假设一个老师可以分配给多个班。然后学生加入班级,或离开。最后,每年一次,你把班级转到下一学年

这意味着班级应该是一个集合,它知道它所属的学校和学年,并且有一名教师,并且包含一个注册学生的列表。此类上有命令,例如:

设置学校、学年 指派教师 加入学生 留校生 迁移学年 然后,学校只是另一个集合,它有如下命令:

建立 改名 同样,学年可以是一个简单的聚合,它有如下命令:

开始 终止 对老师和学生来说,它们也是聚合体。我不会在这里明确列出它们的命令,但我认为您可以自己想出它们

最后,我认为,正如前面所说,你应该关注动词和可能发生的事情,而不是名词。一旦你这样做了,你需要考虑哪些动词可以同时发生,因为它们不会相互干扰,哪些动词不能同时发生。这就是如何定义聚合的原因,因为聚合是事务边界,限制了哪些操作可以同时发生,哪些操作需要按顺序运行

这里很好地描述了如何在中与您的团队进行建模,这是一个针对JavaScript和Node.js的CQRS和事件源框架,我的同事和我正在研究该框架。也许这对你有帮助


希望这有帮助:-

为了回答你的问题,我不得不做一些假设。所以,也许我的回答并不能完全反映你的真实意图,但我已经尽可能地遵循你所描述的。因此,请 对我的回答持保留态度

首先,引起我注意的是,您正在考虑一个对象模型。领域驱动的设计不是关于对象,而是关于过程。所以,当你把注意力集中在名词上时,我建议你把更多的注意力集中在动词上:在你的领域里会发生什么事情

在思考这个问题时,我越来越清楚地意识到,核心问题是课堂:是的,最初你需要建立一所学校,但一旦它建立起来,随着时间的推移,没有多少行动发生。也许它会被重命名,但就是这样

一学年也是如此。我的假设是,我不知道这是否适用于您的具体场景,例如,只有一个2017/2018学年适用于所有学校。也许这在你的场景中是不同的,因为不同的学校可以有不同的学年,但我假设它们总体上是相同的

此外,还有老师和学生,这也是非常简单的事情

这就给我们留下了上课的机会。最初,课程是为特定的学校和特定的学年设置的。然后你给它分配一个老师,我假设每个班只有一个老师,我也假设一个老师可以分配给多个班。然后学生加入班级,或离开。最后,每年一次,你把班级转到下一学年

这意味着班级应该是一个集合,它知道它所属的学校和学年,并且有一名教师,并且包含一个注册学生的列表。此类上有命令,例如:

设置学校、学年 指派教师 加入学生 留校生 迁移学年 然后,学校只是另一个集合,它有如下命令:

建立 改名 同样,学年可以是一个简单的聚合,它有如下命令:

开始 终止 对老师和学生来说,它们也是聚合体。我不会在这里明确列出它们的命令,但我认为您可以自己想出它们

最后,我认为,正如前面所说,你应该关注动词和可能发生的事情,而不是名词。一旦你这样做了,你需要考虑哪些动词可以同时发生,因为它们不会相互干扰,哪些动词不能同时发生。这就是如何定义聚合的原因,因为聚合是事务边界,限制了哪些操作可以同时发生,哪些操作需要按顺序运行

这里很好地描述了如何在中与您的团队进行建模,这是一个针对JavaScript和Node.js的CQRS和事件源框架,我的同事和我正在研究该框架。也许这对你有帮助


希望这有帮助:-

关于学年身份的问题。如果您确信schoolId创建后不会更改,那么我建议使用schoolId year而不是UUID,因为它比UUID更具描述性。但是,如果学年是一个集合,请确保组合(即学号年)在全球范围内是唯一的。

有关学年标识的问题。如果您确信schoolId创建后不会更改,那么我建议使用schoolId year而不是UUID,因为它比UUID更具描述性。但是,如果学年是一个集合,请确保组合(即学号年)在全球范围内是唯一的。

谢谢您的回复。我想你是对的:我更关注名词,应该关注动词。。。坏习惯。。。在整个领域,我还不够完整。我明白你的建议,但在我的场景中,每个学年并不适用于每个学校:一个学年可以适用于学校A,但还不能适用于学校B。在我的web界面中,我必须能够列出给定学校的可用学年。此外,班级是更多的学生群体。我必须存储某一学年哪个学生在哪个班级。所以我不能真正使用moveyear方法。这就是我说的,我必须做一些假设。不管怎么说,我认为如果你更多地从领域的角度来研究这个问题,而不是从技术的角度来研究这个问题,如果你更多地关注动词而不是名词,你现在应该能够自己找到建模的方法;-…附言:如果答案是有帮助的,如果你能投赞成票,我会非常高兴。有关于学年身份的建议吗?参见初始问题中的2个选项。再次感谢。附言:我也是一个好读者:-关于你的观点,你需要能够找出在给定学年哪个学生在哪个班级-你从导致当前状态的事件重播中获得这些信息,只要你做事件来源。关于你的两个选项的问题,我还不确定,我需要再考虑一下。谢谢你的回答。我想你是对的
当前位置我更关注名词,应该关注动词。。。坏习惯。。。在整个领域,我还不够完整。我明白你的建议,但在我的场景中,每个学年并不适用于每个学校:一个学年可以适用于学校A,但还不能适用于学校B。在我的web界面中,我必须能够列出给定学校的可用学年。此外,班级是更多的学生群体。我必须存储某一学年哪个学生在哪个班级。所以我不能真正使用moveyear方法。这就是我说的,我必须做一些假设。不管怎么说,我认为如果你更多地从领域的角度来研究这个问题,而不是从技术的角度来研究这个问题,如果你更多地关注动词而不是名词,你现在应该能够自己找到建模的方法;-…附言:如果答案是有帮助的,如果你能投赞成票,我会非常高兴。有关于学年身份的建议吗?参见初始问题中的2个选项。再次感谢。附言:我也是一个好读者:-关于你的观点,你需要能够找出在给定学年哪个学生在哪个班级-你从导致当前状态的事件重播中获得这些信息,只要你做事件来源。关于你们提出的两个选项的问题,我还不确定,我需要再仔细考虑一下。我还不知道学年是否会是一个整体——这是我最初的问题。但我相信schoolId+年在整个系统中是独一无二的。。。这意味着对该聚合的每个引用都必须存储schoolId和year这两个值。因此,这意味着对于每个引用实体,我必须同时持有schoolId和year的引用。这是正确的?谢谢你的帮助,我还不知道学年是否会是一个整体——这是我最初的问题。但我相信schoolId+年在整个系统中是独一无二的。。。这意味着对该聚合的每个引用都必须存储schoolId和year这两个值。因此,这意味着对于每个引用实体,我必须同时持有schoolId和year的引用。这是正确的?谢谢你的帮助