DDD里的领域服务,到底什么时候该用?

发布时间:2026/9/28 9:54:14

DDD里的领域服务,到底什么时候该用?
做DDD的项目迟早都会遇到一个问题聚合根放不下的逻辑到底往哪放有人说领域服务是可选的聚合根本身就能承载大部分业务逻辑领域服务只是补充。看起来是对的其实错的离谱。但凡真正做过复杂业务的人都会发现领域服务一定会出现。因为聚合根是封闭的计算单元只负责维护自己的状态不碰数据库不调外部接口。但现实中的很多业务规则都需要依赖数据库、其他微服务或者外部系统的数据才能完成。这些职责显然不应该放到聚合根里面。那放应用服务里行不行项目初期当然可以。但随着业务越来越复杂应用服务里的业务规则会越来越多最后一个接口几百行代码应用服务越来越胖领域模型反而越来越薄DDD最终又退化成了传统三层架构。所以当应用服务开始承担越来越多领域规则的时候就应该把这些稳定的业务规则下沉到领域服务。领域服务不是可选项而是DDD真正落地以后必然会出现的一层。在我参与的项目里领域服务主要承担三类职责。第一依赖外部数据才能完成的领域计算。第二聚合根放不下的批量业务规则。第三无法归属于某一个聚合根的领域规则。这些都属于业务规则本质上应该留在领域层而不是应用层。另外还有一条原则必须坚守的就是领域服务之间禁止互相调用。一旦允许领域服务互调今天A调B明天B调C领域层很快就会变成一张蜘蛛网最后和传统三层架构里Service相互调用没有区别。跨聚合、跨模块的协调应该交给应用服务。应用服务负责流程编排领域服务负责业务规则两者职责不要混在一起。那领域服务里能不能调用其他微服务答案是能但必须通过防腐层。领域服务不能直接依赖Dubbo、Feign这些RPC框架而是应该依赖Domain层定义的Gateway接口由基础设施层负责具体实现。这样领域层始终依赖抽象而不是依赖技术框架。小结领域服务存在的意义不是为了让DDD看起来更规范而是为了给那些放不进聚合根、又属于领域规则的逻辑找到一个真正合适的归宿。我一直坚持两个原则1领域服务必须存在。2领域服务之间禁止互相调用。当你发现应用服务越来越臃肿、领域模型越来越薄的时候通常不是DDD有问题而是你的领域服务该出现了。

相关新闻

12. 光刻机和半导体 ArF浸没光刻胶:水痕、气泡类浸没缺陷长效抑制

12. 光刻机和半导体 ArF浸没光刻胶:水痕、气泡类浸没缺陷长效抑制

2026/9/28 9:51:47

Sorting Logic: English (Global Standard) → Chinese (Original Context) → German (Precision Engineering) 12. ArF Immersion Photoresist: Suppression of Water Marks & Bubble-Induced Defects World-Class Hard Tech R&D Roadmap 2026 Version: 1.0 (Hardcor…

Linux包管理工具YUM详解:从基础配置到高级应用

Linux包管理工具YUM详解:从基础配置到高级应用

2026/9/28 9:48:59

1. YUM命令概述与核心价值在RPM系Linux发行版中,yum(Yellowdog Updater Modified)作为经典的包管理工具,其重要性不亚于Debian系的apt。我第一次接触yum是在2008年维护CentOS 5服务器时,当时就被它自动解决依赖关系的特…

同一个wifi里面是可以正常聊天的

同一个wifi里面是可以正常聊天的

2026/9/7 11:13:15

2个手机都是只打开了wifi,没有用5G网络

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/28 4:08:17

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/27 1:30:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/28 2:15:29

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/28 3:14:54

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/28 3:58:00

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/28 3:47:14

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/26 14:29:04

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/28 5:05:21

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/26 23:35:16

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…