域驱动设计 – DDD在有界上下文中引用子实体
假设我有一个带有2个聚合根的“目录”有界上下文.公司和个人.公司拥有一组子实体“位置”,用于保存人员聚合的ID以及一些额外的值数据.
都好. 现在我们去添加一个带有聚合根JobAriticle的“Article”有界上下文.这需要一个从公司位置映射的Contact值对象. 所以知道你应该只引用聚合根,我该怎么办?假设公司与位置关系存在不变量,因此我不想拆分聚合.是否可以通过反腐败层使用公司和位置ID映射位置?或者我是否需要尝试拆分公司聚合. 解决方法
如果位置是“条款”有界上下文的普遍语言中的有意义概念,则位置应该是“条款”有界上下文中的值对象或实体.
如果你说联系是“文章”有界上下文中有意义的概念,但它需要以某种方式与“目录”有界上下文中的位置相关联,那么你需要考虑相关性的目的是什么: >在JobArticle上创建联系人之前,您是否需要验证位置是否存在? 如果您需要在创建关联联系人之前验证职位是否存在,那么隐式职位会在文章上下文的职责中扮演角色 – 所以我很想在文章上下文中创建一个新的职位实体并使其保持同步. 无论哪种方式,要将Article上下文中的某些内容与Directory上下文中的相应实体相关联,您可以在名为PositionCorrelation的“Article”上下文中创建一个ValueObject,它将具有两个属性: > CompanyId(全球唯一) 聚合应仅引用其他聚合根的规则并不意味着您也不能提供用于标识聚合中实体的信息.它只是意味着如果你想与其他实体交互,你应该通过聚合根来实现,这意味着你必须至少拥有聚合根ID.如果您然后使用本地身份证要求公司对其中一个职位做某事,那就没问题. 但是 – 请注意,通过遵循这种方法,您将“位置”一词引入“条款”有界上下文,如果“位置”一词在“文章”上下文中表示其他内容,则可能引入名称冲突 – 例如也许它意味着文章中的位置(段落编号等).如果是这种情况,您需要仔细考虑调用跨上下文标识符的内容. 一种方法可能是,如果Position与Contact有一对一的地图,那么您可以将两个属性设为: > CompanyId 当在上下文之间进行集成时,在反腐败层(ACL)保持同步时,将CompanyContactId和PositionId(公司内的本地)值定义为同义.这使每个UL内部保持一致,并在ACL中定义两者之间的相关性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |