领域驱动设计的核心思想,就是对边界的划分与控制。
第一重边界:需求分析就通过确定项目的愿景与目标,划定问题空间,由此确定核心子领域、通用子领域与支撑子领域。理清了领域逻辑的优先级,同时促使团队在宏观层次的全局分析阶段能够将设计的注意力放在领域和对领域模型的理解上,满足领域驱动设计的要求。
第二重边界:进入解决方案空间,战略设计获得的限界上下文成为了领域驱动设计的。通过它可以有效地降低系统规模,无论是在业务领域,还是架构设计,或者团队协作方面,限界上下文建立的边界都成为了重要的约束力,边界内外可以形成两个不同的世界。暴露在限界上下文边界外部的是远程服务或应用服务,每个服务都提供了完整的业务价值,并通过相对稳定的契约来展现服务,由此确定限界上下文之间的协作方式。在限界上下文边界之内,可以根据不同的需求场景,形成自己的一套设计与实现体系。外部世界的规则是契约、通信以及系统级别的架构风格与模式,内部世界的规则是分层、协作以及类级别的设计风格与模式。
第三重边界:在限界上下文内部,基础设施层、应用层与领域层之间的隔离成为了领域驱动设计的。如果以六边形架构来观察这种层与层之间的隔离,体现的仍然是一种内外隔离,应用层形成了一种保护层,有效地隔离了业务复杂度与技术复杂度。将领域层作为整个系统稳定而内聚的核心,是领域驱动设计的关键特征。唯有如此,才能逐渐将这个“领域内核”演化为企业的重要资产。这也是软件设计的核心思想,即分离变与不变。领域内核中的领域模型具有一种本质的不变性,只要我们将领域逻辑剖析清楚,该模型就能保证相对的稳定性;若能再正确地识别可能的扩展与变化,加以抽象与封装,就能维持领域模型绝对的稳定性。内核之外的外部资源具有一种偶然的不变性,一旦外部形势发生变化,这种偶然的不变性就可能瞬间崩塌,需要重新建造方能焕然一新。
第四重边界:若要维持领域内核的稳定性,高内聚与低耦合是其根本要则。虽然职责分配的不合理在应用层边界的隔离下可以将影响降到最低,但总是在调整与修改的领域模型无法维护领域概念的完整性和一致性;为此,领域模型引入了聚合这一最小的设计单元,它从完整性与一致性对领域模型进行了有效的隔离。领域驱动设计为聚合规定了严谨的设计约束,使得整个领域模型的对象图不再变得散漫,彼此之间的协作也有了严格的边界控制。这一约束与控制或许加大了我们设计的难度,但它却可以挽救因为限界上下文边界划分错误带来的不利决策。聚合设计原则要求聚合之间通过ID进行关联,避免了聚合根实体之间的引用依赖,也不会受到限界上下文边界变化的影响。
这四重边界如下图所示: