DDD在有界上下文中引用子实体

时间:2016-11-06 21:31:09

标签: domain-driven-design bounded-contexts

假设我有一个带有2个聚合根的“目录”有界上下文。公司和个人。公司拥有一系列子实体“位置”,用于保存人员聚合的ID以及一些额外的价值数据。

一切都很好。

现在我们去添加一个带有聚合根JobAriticle的“Article”有界上下文。这需要一个从公司位置映射的Contact值对象。

所以知道你应该只引用聚合根,我该怎么办?假设公司与位置关系存在不变量,因此我不想拆分聚合。是否可以通过反腐败层使用公司和位置ID映射位置?或者我是否需要尝试拆分公司聚合。

1 个答案:

答案 0 :(得分:5)

如果Position是"文章"的普遍语言中的一个有意义的概念。有界上下文然后Position应该是"文章"中的值对象或实体。有限的背景。

如果你说Contact是"文章"中有意义的概念。有限的上下文,但它需要以某种方式与"目录"中的Position相关联。有界的上下文,那么你需要考虑这种相关的目的是什么:

  • JobArticle
  • 上创建联系人之前,您是否需要验证位置是否存在?
  • 是否有一些共享数据会在PositionContact之间保持同步?
  • 如果某个职位被存档/删除或以其他方式退出服务会怎么样 - 您是否必须对所有联系人做些什么?

如果您需要在创建关联的联系人之前验证Position是否存在,那么隐式位置会在文章上下文的职责中扮演角色 - 所以我很想创建一个新的Position文章上下文中的实体并保持同步。

无论哪种方式,要将Article上下文中的某些内容与Directory上下文中的相应实体相关联,您可以在" Article"中创建一个ValueObject。名为PositionCorrelation的上下文,它有两个属性:

  1. CompanyId(全球唯一)
  2. PositionId(公司内部本地唯一)
  3. 汇总的规则应仅引用其他汇总根并不意味着您无法 提供识别汇总中实体的信息。这只是意味着如果你想与其他实体交互,你应该通过聚合根来实现它,这意味着你必须至少拥有聚合根ID。如果您那么使用本地ID来要求公司对其中一个职位做某事,那很好。

    但是 - 请注意,通过遵循这种方法,您将引入术语" Position"进入"文章"有界上下文,如果单词" Position"意味着"文章"上下文 - 例如也许它意味着文章中的位置(段落编号等)。如果是这种情况,您需要仔细考虑调用跨上下文标识符的内容。

    一种方法可能是,如果PositionContact有一对一的地图,那么您可以将两个属性设为:

    1. CompanyId
    2. CompanyContactId
    3. 当在上下文之间进行集成时,在反腐败层(ACL)保持同步时,将CompanyContactId和PositionId(公司内的本地)值定义为同义。这使每个UL内部保持一致,并在ACL中定义两者之间的相关性。