知识卡片

贫领域模型:找不到聚合根时,仍可借鉴聚合思想设计

普通读书笔记卡

内容

不是所有业务场景都能顺利找出聚合根。有一类业务场景包含多个相互独立、互不依赖的实体,它们之间是松耦合关系,主要参与的是数据分析或计算,这种情况下找不出一个能管理其他对象生命周期的聚合根,这种领域模型被称为贫领域模型。书中给出一个具体的真实例子:客户归并功能——扫描全部客户数据,按身份证号、电话号码等规则判断哪些是重复客户,再对重复客户做归并处理,这类业务里的实体之间没有谁管理谁的生命周期关系,自然也就找不到聚合根。但贫领域模型不代表这块功能就没有边界、可以随意堆砌代码:这些实体尽管找不到聚合根,业务本身仍然是高内聚的,它们组合起来的业务能力仍然属于某一个限界上下文,不适合被单独拆成一个独立的微服务。所以处理贫领域模型的做法是:仍然借鉴聚合的设计思想来给这部分功能划定一个”类聚合”边界,用和富领域模型同样的分析方法去梳理实体的属性方法、做服务分层封装、设计仓储、理清领域对象间的依赖关系,唯独少了”聚合根”这一个角色而已——除了聚合根管理功能,DDD的其他设计手段依然完全适用。这提醒:DDD方法论的价值不完全捆绑在”必须找到聚合根”这一件事上,即使某个业务场景天生不具备聚合根这种角色,围绕高内聚划定边界、按标准结构组织代码的思路依然可以套用。

参考来源

- 位置:第15章《如何保证领域模型与代码模型一致》"15.2.3 领域对象与代码对象的映射","2. 贫领域模型"(源文件:_epub-src/OEBPS/Text/chapter4-4-2-3.xhtml) - 结论依据:原文说明"有些业务场景……有多个实体,实体之间相互独立、互不依赖……你找不出聚合根。这种领域模型是贫领域模型……比如,在个人客户领域模型内有客户归并的功能……在这种业务场景你就找不到聚合根!……我们仍然可以借鉴聚合的设计思想来定义这部分功能,并采用与富领域模型同样的分析方法",直接支撑本卡片结论。 - 原始内容:就业务本身来说它们是高内聚的,它们所组合的业务能力与其他聚合在一个限界上下文内,你也不大可能将它单独设计为一个微服务……我们仍然可以借鉴聚合的设计思想,用聚合来定义这部分功能,并采用与富领域模型同样的分析方法……唯一可惜的就是我们找不到聚合根。