DDD-如何在实体必须引用非根实体的情况下形成聚合 [英] DDD - How to form Aggregates where Entities have to reference non-root Entities

查看:21
本文介绍了DDD-如何在实体必须引用非根实体的情况下形成聚合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些实体,我正在尝试遵循领域驱动设计实践来识别聚合。不知何故,我无法这样做,因为我要么打破了实体不允许引用其他聚合的非根实体的规则,要么根本无法形成聚合。

我有以下实体:组织、JobOffer、候选人和JobApplication。

  • 组织创建JobOffer,但可能只有有限数量的活动JobOffer。
  • 候选人创建职务申请,但可能只有有限数量的活动职务申请。
  • JobApplication引用其预期的JobOffer。
基于这一点,我必须知道一个组织有多少个JobOffers,然后才能创建一个新的组织(强制限制),因此我认为Organization应该是拥有JobOffers的根实体。这同样适用于应聘者和求职申请。现在我有两个集合:提供工作的组织和申请工作的候选人。但是..。我需要从JobApplication引用JobOffer.这打破了我不能引用非根实体的规则。

我在这个论坛上寻找并发现了类似的问题,但不知何故还是想不出来,所以提前表示歉意-感谢您的帮助。

推荐答案

一般来说,您应该避免持有对其他聚合的对象引用,而应该通过id引用其他聚合。在某些情况下,引用另一个聚合中的某个实体可能是有效的,但同样,这也应该通过id来完成。

如果这样做,则应该引用复合ID。聚合用于描述逻辑边界以及事务边界。建模为聚合一部分的子实体ID只需要在该聚合的边界内是唯一的。这使得在系统中执行操作时只关注这些边界内的内容变得容易得多。即使您正在使用UUID(或GUID),如果您确实需要引用另一个聚合的子实体-比方说您有很好的理由-您应该通过聚合根建模id图,这意味着始终知道另一个聚合的id以及您感兴趣的实体的id。这意味着引用复合ID

但是:每当我认为需要引用另一个聚合根的子实体时,首先我会对此进行更深入的研究。这意味着该子实体作为独立实体可能也很重要。

我是否错过了发现另一个聚合根?

在您的案例中,从您的域模型图来看,我怀疑JobOffer本身应该是一个聚合。当然,我不知道您的领域,但我至少可以猜测,您的系统中可能执行了一些事务,允许在不需要考虑特定于组织的业务不变量的情况下自行更改工作机会。如果是这种情况,您应该重新考虑域模型,并考虑使JobOffer本身成为聚合根。在这种情况下,您最初的问题会自动解决。另请注意,将职务待遇建模为集合可以简化对组织执行的操作,而且在加载组织集合时无需加载该组织的所有职务待遇。当然,这可能与您的情况无关,实际上取决于组织获得的最大工作机会。

所以我认为,根据您的业务需求和域逻辑不变量,我会推荐以下两个选项之一:

  • 只能通过复合id引用外部子实体,该复合id包括其他聚合的id+子实体id(例如,通过创建将此引用表示为强类型的某个值对象)
  • 如果上述考虑因素在您的情况下成立,则使JobOffer本身成为聚合

这篇关于DDD-如何在实体必须引用非根实体的情况下形成聚合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆