【发布时间】:2019-08-07 06:12:22
【问题描述】:
我正在考虑一个相当简单的问题的设计,但我想听听其他解决方案来正确处理它。
目前我有 2 个聚合根:
-
User:保存有关用户的信息,例如display name、linked accounts和profile,可以是patient profile或care provider profile。此类患者资料包含birth date和gender等信息。我有一个UserRepository负责获取和保存用户。 -
Screening:保存有关健康的信息,例如长度和体重测量值,以及基于这些长度和重量的所有类型的计算信息,例如“短期进化”。我有一个ScreeningRepository负责获取和保存用户.
所以Screening中有一个Calculate()方法,目标是当weight和/或length添加到screening后,像short term evolution这样的健康属性会立即重新计算, 使screening 始终处于一致且正确的状态。
问题是这个计算还需要用户的gender和birth date,存储在patient profile中。
所以基本上,聚合根screening 依赖于聚合根user。所以我想知道该怎么做......
根据 DDD,聚合根不应引用另一个聚合根。而且,如果我将
user设为screening的属性,ScreeningRepository也将负责将用户非实体化,这当然不是他的任务。如果
screening没有引用user,则Calculate()没有所有需要的信息。所以这意味着我可能应该将它移动到一个域服务,它以user和screening作为输入,并进行计算。美好的。但是,如何确保将测量添加到筛选中时会触发Calculate?我正在考虑的另一个选项是不将
screening设为聚合根,而将其设为与父user的聚合。这也让我可以更好地验证screening,因为我也可以访问User。它将解决有关计算的所有问题,因为我手头有所有信息,但是这样,UserRepository也将负责处理screening,而我的聚合根将负责users和screenings.
在这一点上,最后一个选项似乎是唯一可以轻松解决问题的选项,但我很想听听任何想法,因为我可能会遗漏明显的概念。
【问题讨论】:
标签: architecture domain-driven-design aggregateroot