DDD经典的四层架构和洋葱架构、六边形架构区别

6 阅读5分钟

在领域驱动设计(DDD)中,经典四层架构洋葱架构(Onion Architecture)六边形架构(Hexagonal Architecture)是三种常见的设计模式,它们的核心目标都是隔离领域逻辑与技术实现,但实现方式和设计理念有所不同。以下是它们的对比分析:


1. 经典四层架构

结构

  • 分层依赖:用户接口层 → 应用层 → 领域层 ← 基础设施层
    (基础设施层通过依赖倒置实现领域层的接口)
  • 典型分层
    1. 用户接口层:处理输入/输出(HTTP、消息等)。
    2. 应用层:协调领域对象,管理事务和流程。
    3. 领域层:核心业务逻辑(实体、值对象、聚合根、领域服务)。
    4. 基础设施层:实现技术细节(数据库、消息队列、外部API)。

特点

  • 垂直分层:依赖方向清晰,但基础设施层可能直接依赖领域层。
  • 适用场景:适合业务复杂度中等、技术栈相对稳定的项目。
  • 代码示例
    src/main/java
    ├── interfaces  // 用户接口层
    ├── application // 应用层
    ├── domain      // 领域层
    └── infrastructure // 基础设施层
    

优缺点

优点缺点
分层简单,易于理解基础设施层可能侵入领域层
适合传统企业应用开发依赖方向不够严格

2. 洋葱架构(Onion Architecture)

结构

  • 核心思想:以领域模型为中心,逐层向外扩展,依赖方向向内
    Onion Architecture转存失败,建议直接上传图片文件
  • 典型分层
    1. 领域模型(最内层):实体、值对象、聚合根。
    2. 领域服务:核心业务规则。
    3. 应用服务:协调领域对象,定义用例。
    4. 基础设施/UI(最外层):数据库、外部服务、用户界面。

特点

  • 依赖规则:外层依赖内层,内层不感知外层。
  • 适配器模式:通过接口隔离技术实现(如数据库仓储接口)。
  • 适用场景:高内聚、业务复杂的系统,强调领域模型的纯粹性。

代码示例

src/main/java
├── core          // 领域模型和领域服务(最内层)
├── application   // 应用服务(中间层)
└── infrastructure // 基础设施适配器(最外层)

优缺点

优点缺点
领域模型完全独立分层较多,初期设计成本高
依赖方向严格,易于测试对团队设计能力要求较高

3. 六边形架构(Hexagonal Architecture)

结构

  • 核心思想:应用是一个“六边形”,核心业务逻辑位于中心,通过“端口”(Port)与外部适配器(Adapter)交互。
    Hexagonal Architecture转存失败,建议直接上传图片文件
  • 核心组件
    • 端口(Port):定义输入/输出接口(如仓储接口、消息发布接口)。
    • 适配器(Adapter):实现端口(如HTTP控制器、数据库仓储实现)。
  • 方向性
    • 主适配器(Primary Adapter):驱动应用(如用户通过HTTP调用)。
    • 次适配器(Secondary Adapter):被应用驱动(如数据库操作)。

特点

  • 技术无关性:核心业务逻辑不依赖任何技术框架。
  • 对称性:所有外部交互均通过端口和适配器。
  • 适用场景:需要高度解耦的系统(如微服务、多端兼容)。

代码示例

src/main/java
├── core          // 领域模型和应用服务(核心)
├── ports         // 端口定义(接口)
└── adapters      // 适配器实现(HTTP、数据库、消息队列)

优缺点

优点缺点
彻底解耦核心与外部技术初期设计复杂度高
支持多端适配(Web、CLI等)需要团队熟悉端口-适配器模式

4. 三种架构对比

维度四层架构洋葱架构六边形架构
核心目标分层隔离技术细节以领域模型为中心逐层扩展通过端口-适配器彻底解耦
依赖方向单向分层依赖依赖向内,外层依赖内层核心不依赖外部,适配器实现端口
技术无关性领域层依赖基础设施接口领域模型完全独立核心逻辑完全独立
适用场景传统企业应用复杂业务系统高解耦需求(微服务、多端)
代码结构垂直分层(用户接口→基础设施)同心圆分层(核心→外围)核心+端口+适配器
设计复杂度

5. 核心共同点

  1. 领域模型为核心:三种架构均强调领域模型的独立性。
  2. 隔离技术细节:通过分层或端口-适配器模式解耦业务与技术。
  3. 依赖倒置原则:高层模块不依赖低层细节,而是依赖抽象接口。

6. 如何选择?

  1. 经典四层架构:适合业务复杂度中等、团队对DDD理解较浅的项目。
  2. 洋葱架构:适合需要严格领域隔离、业务逻辑复杂的系统(如金融、电商)。
  3. 六边形架构:适合需要多端支持、技术栈频繁变化的系统(如微服务、SaaS平台)。

总结

  • 四层架构是DDD的入门级分层模式,简单但依赖管理不够严格。
  • 洋葱架构通过同心圆分层强化领域模型的纯粹性,适合复杂业务。
  • 六边形架构通过端口-适配器模式实现彻底解耦,适合高灵活性和多端场景。
    选择建议:根据团队经验和业务复杂度权衡,优先保证领域模型的独立性。