Sté*_*ane 1 entity domain-driven-design reference aggregateroot
这是我在DDD上的第一次尝试,我想获得有关建模问题的建议。
这是我的专长:多所学校的管理。
2017-2018
的实例)我的第一个疑问是对schoolYear的建模。
我已经将学校实体作为根集合。我的第一个方法是让学校聚合处理增加的schoolYear(这样我就可以避免重复,或者可以创建下一个schoolYear,……)
=> schoolYear是学校总数的一部分
但是后来我不得不对课程和学生分数进行建模……这取决于学校的年份。
因此,在我的所有班级中,我必须保留对schoolYear的引用……这违反了规定
“无法从外部汇总中引用内部实体。”
在我的领域中,很多实体都取决于特定的SchoolYear。也许应该是一个汇总……
另一方面,给定班级的schoolYear用于搜索班级。
我可以获取有关此建模问题的一些建议吗?
另一个有疑问的问题是关于schoolYear的身份。
有什么建议吗?
非常感谢您帮助我进入DDD世界!
为了回答您的问题,我不得不做一些假设。因此,也许我的答案不能完全反映您的实际意图,但是我尝试尽可能地遵循您的描述。因此,请以我的回答为准。
首先,引起我注意的是您正在考虑对象模型。域驱动的设计与对象无关,而与过程有关。因此,当您专注于名词时,我建议您更多地关注动词:在您的领域中可能发生了什么?
虽然在想这个问题就变得更清晰,我认为中央的事情是类:是的,你需要找到一个学校开始,但一旦它已经建立,不会有太多的动作发生一段时间。也许它被重命名了,仅此而已。
一学年也是如此。我的假设是(我不知道这对您的具体情况是否正确)例如,仅存在一个适用于所有学校的2017/2018 学年。也许在您的情况下这是不同的,因为不同的学校可以有不同的学年,但我认为它们总体上是相同的。
此外,还有老师和学生,这也很简单。
这使我们有了阶级。原来,一类获取设置为特定学校,特定学年。然后为它分配一位老师(我假设每个班级只有一位老师,并且我还假设可以将一位老师分配给多个班级)。然后,学生参加课程,或者离开。最后,每年一次,您将课程移至下一学年。
这意味着班级应该是一个汇总,知道班级所属的学校和学年,哪个班级有一位老师,并包含一个已注册学生的列表。您在此类上具有命令,例如:
然后,学校只是另一个集合,它具有以下命令:
同样,schoolYear可以是一个简单的聚合,其中包含以下命令:
对于老师和学生 -好吧,它们也是集合体。我不会在这里为它们明确列出命令,但我认为您可以自己提出它们。
最后,我相信,如上所述,您应该更关注动词和可能发生的事情,而不是名词。完成此操作后,您需要考虑哪些动词可以同时发生,因为它们不会相互干扰,并且哪些动词不能同时发生。这就是导致您如何定义聚合的原因,因为聚合是事务性边界,它限制了可以同时发生的操作以及需要顺序执行的操作。
我和我的同事正在研究wolkenkit的文档中很好地描述了如何与您的团队进行建模,该文档是针对JavaScript和Node.js的CQRS和事件源框架。也许对您有帮助。
希望这可以帮助 :-)