当前位置: 首页 > news >正文

领域驱动设计(DDD)中的“核心领域逻辑与基础设施分离”原则

领域驱动设计(DDD)中的“核心领域逻辑与基础设施分离”原则

该原则是 DDD 分层架构(Clean/Hexagonal/Onion Architecture)的基石,它通过把“业务如何运作”与“技术如何实现”解耦,使领域模型能够独立于具体框架、数据库或 UI 演进。其重要性体现在:
• 保障业务知识的纯粹性与可测试性;
• 降低技术栈替换成本;
• 支撑以领域为中心的迭代与演进。
应用场景:微服务划分、CQRS/事件溯源、六边形架构、云原生迁移、遗留系统现代化等。


一、知识点框架/介绍

“核心领域逻辑与基础设施分离”是 DDD 战术设计中“分层/六边形/洋葱架构”的核心约束。它把系统划分为两个正交维度:

  1. 业务维度:聚焦“业务问题”——领域模型、业务规则、业务流程。
  2. 技术维度:聚焦“解决方案”——持久化、消息、REST、UI、第三方 API。

通过引入**端口(Port)与适配器(Adapter)**机制,领域层只依赖自己定义的端口(接口),而由基础设施层提供适配器实现。这样,领域层对 Spring、JPA、Kafka、React 等技术完全无感知,形成“可独立演进、可快速测试”的内核。

驱动端口
驱动端口
使用端口
使用端口
实现
实现
UI Adapter
Application Service
REST Adapter
Domain Model
Repository Port
JPA Adapter
Kafka Adapter
Domain Event Publisher Port

二、知识点详解

2.1 核心领域逻辑(Core Domain Logic)

核心领域逻辑是“业务如何创造核心价值”的抽象,包含:

  • 实体(Entity)与值对象(Value Object):表达业务概念及其不变式。
  • 领域服务(Domain Service):编排跨聚合的纯业务行为。
  • 领域事件(Domain Event):记录业务状态变化的事实。
  • 业务规则(Specification/Policy):以可测试的纯函数或策略对象存在。

这些元素不依赖任何技术框架,仅依赖语言本身和领域通用语言(Ubiquitous Language)。因此,它们可以在内存中快速单元测试,无需启动 Spring 容器或连接真实数据库。

2.2 基础设施功能(Infrastructure Concerns)

基础设施层负责“把领域意图翻译成技术现实”,典型职责包括:

  • 持久化适配器:实现 Repository 端口,把聚合根保存到 MySQL、MongoDB 或 Event Store。
  • 消息适配器:实现 EventPublisher 端口,把领域事件发布到 Kafka、RabbitMQ。
  • 外部服务适配器:调用第三方支付、物流、身份验证服务,并防腐(ACL)。
  • UI 适配器:把用户输入转换成应用服务参数,把领域查询结果渲染成 DTO/ViewModel。

这些适配器只负责技术转换,不包含任何业务规则;一旦技术栈升级(如 JPA → jOOQ,Kafka → Pulsar),只需替换对应适配器,领域层代码零改动。

2.3 依赖倒置与端口/适配器模式

为了实现“领域层不依赖基础设施”,必须采用依赖倒置原则(DIP)

  • 领域层定义端口(接口),如 OrderRepositoryEventPublisher
  • 基础设施层提供适配器(实现),如 JpaOrderRepositoryKafkaEventPublisher
  • 运行时通过依赖注入把适配器注入到应用服务,实现“可插拔”架构。
«interface»
OrderRepository
+save(order: AggregateRoot)
«interface»
EventPublisher
+publish(event: DomainEvent)
JpaOrderRepository
+save(order: AggregateRoot)
KafkaEventPublisher
+publish(event: DomainEvent)
2.4 分层与包结构落地

在代码层面,常用两种包结构:

  1. 分层包(Layered Package)

    com.example.order
    ├── application
    ├── domain
    │   ├── model
    │   └── service
    └── infrastructure├── persistence└── messaging
    
  2. 按领域分包(Package by Feature / Bounded Context)

    com.example.order
    ├── ordercontext
    │   ├── application
    │   ├── domain
    │   └── infrastructure
    

无论哪种结构,都需保证领域包不依赖 infrastructure 包,编译时即可验证依赖方向。


三、总结

维度核心领域逻辑基础设施功能
关注点业务规则、流程、不变式技术实现、框架、协议
依赖方向不依赖外部依赖领域端口
可替换性不可替换(业务核心)可插拔(技术细节)
测试方式纯内存单元测试集成测试、契约测试
示例Order、PricingPolicyJpaOrderRepository、KafkaProducer

架构师洞见:
把“业务如何赚钱”与“技术如何落地”解耦,是架构可持续演进的关键。掌握该原则后,团队可以:
• 以领域模型为核心进行迭代,避免“技术绑架业务”;
• 在不影响业务逻辑的前提下,平滑迁移到云原生、Serverless 或事件驱动架构;
• 通过“领域层 + 端口”快速构建可测试、可演进的微服务内核。
未来,随着 AI 代码生成、低代码平台的普及,领域模型将越来越成为“唯一需要人工精雕细琢”的资产,而基础设施层则趋向自动化、声明式配置。

http://www.dtcms.com/a/337222.html

相关文章:

  • Maven 生命周期和插件
  • RocketMQ是什么?
  • Day7--滑动窗口与双指针--1695. 删除子数组的最大得分,2958. 最多 K 个重复元素的最长子数组,2024. 考试的最大困扰度
  • 消息队列中的推模式与拉模式
  • C++/Java双平台表单校验实战:合法性+长度+防重复+Tab顺序四重守卫
  • 【从0开始学习Java | 第14篇】集合(上)
  • Day8--滑动窗口与双指针--1004. 最大连续1的个数 III,1658. 将 x 减到 0 的最小操作数,3641. 最长半重复子数组
  • 考问通系统测试分析报告
  • Golang 语言中的指针操作
  • Android中使用RxJava实现网络请求与缓存策略
  • 实习两个月总结
  • 通义万相Wan2.1- 阿里推出的开源视频生成大模型
  • 从哲学(业务)视角看待数据挖掘:从认知到实践的螺旋上升
  • Elasticsearch查询中的track_total_hits参数
  • 【网络安全实验报告】实验五:网络嗅探及安全性分析
  • 在阿里云 CentOS Stream 9 64位 UEFI 版上离线安装 Docker Compose
  • CentOS 7更换国内镜像源
  • CentOS 7安装OpenVASGVM指南
  • 国产!全志T113-i 双核Cortex-A7@1.2GHz 工业开发板—ARM + DSP、RISC-V核间通信开发案例
  • [数据结构] ArrayList 与 顺序表
  • OVS:ovn为什么默认选择Geneve作为二层隧道网络协议?
  • 【Day 30】Linux-Mysql数据库
  • 大数据计算引擎(三)——Elasticsearch入门
  • uart串口 day57
  • 产品经理如何提升职场学习能力?破除成长瓶颈
  • Vue+Flask 电影协同推荐可视化平台 前后端分离 大数据分析
  • Windows从零到一安装KingbaseES数据库及使用ksql工具连接全指南
  • 05.用户和组管理命令
  • 【机器学习】FPR(False Positive Rate,误报率)是什么?
  • Zephyr下ESP32S3开发环境搭建(Linux篇)