内容提要
DDD 包含四重边界:分析边界划分核心域、通用域与支撑域;设计边界用限界上下文控制业务、团队与技术边界;实现边界通过分层与依赖倒置隔离领域层,并采用南北网关对称架构;运行边界以聚合为最小单元,保障领域模型的完整性与一致性,聚合间通过最终一致性协作。
延伸解读
四重边界:从分析到运行的递进控制
文章将DDD的边界划分为分析、设计、实现和运行四重,分别对应问题空间划定、限界上下文控制、分层与依赖倒置、聚合隔离。这四重边界并非孤立,而是从业务价值到技术实现再到运行一致性的递进。理解这种递进关系,有助于团队在不同阶段聚焦不同边界,避免过早陷入技术细节或忽视业务核心。
限界上下文:控制边界比划分更重要
文章强调引入限界上下文的目的不在于如何划分,而在于如何控制边界。它从领域逻辑、团队合作和技术实现三个层面分别控制业务边界、工作边界和应用边界,从而降低业务、管理和技术复杂度。这意味着划分限界上下文时,不能只考虑业务模型,还需兼顾团队沟通成本和技术风险,否则边界可能形同虚设。
对称架构:解决出口端口的位置尴尬
在实现边界中,文章指出领域层需要定义资源库作为出口端口,但访问消息队列等外部设备时,出口端口放在领域层会显得不伦不类,放在外部又违背整洁架构。于是提出将端口与适配器统一为网关,形成南北对称的菱形架构。这一调整虽脱胎于六边形架构与DDD分层,却改变了原有风格,体现了对依赖倒置原则的灵活应用。
聚合边界:以最终一致性维护领域完整性
第四重边界以聚合为最小设计单元,通过聚合根保证内部实体规则的正确性和数据一致性。外部对象只能通过ID引用聚合根,聚合根之间不能共享数据库事务,需通过最终一致性协作。这提醒开发者,聚合的设计直接影响领域模型的稳定性和一致性,过度拆分或合并聚合都可能破坏边界,需谨慎权衡。
Q&A
DDD的四重边界具体指哪四个?
DDD的四重边界分别是:分析边界、设计边界、实现边界和运行边界。分析边界用于确定业务问题范围,定义问题域;设计边界根据领域模型划分限界上下文;实现边界确保软件实现符合领域编程模型;运行边界以聚合为最小单元,保障领域模型的完整性与一致性。
在DDD中,核心域、通用域和支撑域有什么区别?
核心域是决定产品和公司核心竞争力的子域,是业务成功的主要因素;通用域是没有太多个性化诉求、被多个子域使用的通用功能子域,如认证、权限,容易买到且无需太多定制化;支撑域既不包含核心竞争力功能,也不包含通用功能,但又是必需的,具有企业特性但不具通用性,例如数据字典等系统。
限界上下文在DDD中起到什么作用?
限界上下文是DDD的第二重边界,其目的不在于如何划分,而在于如何控制边界。它从三个层面控制边界:领域逻辑层面确定业务边界,维护模型完整性与一致性;团队合作层面确定工作边界,建立团队合作模式;技术实现层面确定应用边界,保证系统层和上下文领域层的一致性。引入限界上下文意味着系统架构与组织结构都是可控的。
DDD实现边界中,依赖倒置是如何应用的?
在实现边界中,通过依赖倒置优化传统四层架构,实现各层对基础层的解耦。领域层不能依赖外层,因此出口端口只能放在领域层,例如资源库(Repository)作为管理聚合生命周期的抽象出口端口。对于访问文件、网络、消息队列等外部设备,也需定义抽象出口端口,但位置尴尬,最终通过将端口和适配器统一为“网关”来解决,形成南北网关对称架构。
聚合在DDD中是什么?它如何保证一致性?
聚合是DDD的第四重边界,是领域模型的最小设计单元,本质是个实体,用来保证内部实体规则的正确性和数据一致性。外部对象只能通过ID引用聚合根,不能引用聚合根内部的实体。聚合根之间不能共享一个数据库事务,它们之间的数据一致性需要通过最终一致性来保证。
康威定律如何影响限界上下文的划分?
康威定律认为,组织设计的系统结构与其沟通结构保持一致。在限界上下文中,沟通成本是关键杠杆:如果同一限界上下文的工作交给两个团队,团队间沟通成本高于团队内,就需要重新划分团队;如果同一团队做两个限界上下文的工作,则会因弱相关性自然隔离。因此,限界上下文的划分需考虑团队合作边界,以降低管理复杂度。