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

做DDD的项目,迟早都会遇到一个问题:聚合根放不下的逻辑,到底往哪放?

有人说领域服务是可选的,聚合根本身就能承载大部分业务逻辑,领域服务只是补充。

看起来是对的,其实错的离谱。但凡真正做过复杂业务的人都会发现,领域服务一定会出现。

因为聚合根是封闭的计算单元,只负责维护自己的状态,不碰数据库,不调外部接口。

但现实中的很多业务规则,都需要依赖数据库、其他微服务或者外部系统的数据才能完成。这些职责显然不应该放到聚合根里面。

那放应用服务里行不行?项目初期当然可以。

但随着业务越来越复杂,应用服务里的业务规则会越来越多,最后一个接口几百行代码,应用服务越来越胖,领域模型反而越来越薄,DDD最终又退化成了传统三层架构。

所以,当应用服务开始承担越来越多领域规则的时候,就应该把这些稳定的业务规则下沉到领域服务。

领域服务不是可选项,而是DDD真正落地以后必然会出现的一层。

在我参与的项目里,领域服务主要承担三类职责。

第一,依赖外部数据才能完成的领域计算。

第二,聚合根放不下的批量业务规则。

第三,无法归属于某一个聚合根的领域规则。

这些都属于业务规则,本质上应该留在领域层,而不是应用层。

另外还有一条原则,必须坚守的,就是领域服务之间禁止互相调用。

一旦允许领域服务互调,今天A调B,明天B调C,领域层很快就会变成一张蜘蛛网,最后和传统三层架构里Service相互调用没有区别。

跨聚合、跨模块的协调,应该交给应用服务。应用服务负责流程编排,领域服务负责业务规则,两者职责不要混在一起。

那领域服务里能不能调用其他微服务?

答案是:能,但必须通过防腐层。

领域服务不能直接依赖Dubbo、Feign这些RPC框架,而是应该依赖Domain层定义的Gateway接口,由基础设施层负责具体实现。这样领域层始终依赖抽象,而不是依赖技术框架。

小结:

领域服务存在的意义,不是为了让DDD看起来更规范,而是为了给那些放不进聚合根、又属于领域规则的逻辑,找到一个真正合适的归宿。

我一直坚持两个原则:

1,领域服务必须存在。

2,领域服务之间禁止互相调用。

当你发现应用服务越来越臃肿、领域模型越来越薄的时候,通常不是DDD有问题,而是你的领域服务,该出现了。

相关推荐
不爱说话郭德纲10 小时前
我只给了 TRAE Work 一张差评截图,它最后却把自己的 P0 结论推翻了?
前端·后端·架构
深圳元器猫11 小时前
从分立到集成:RX8130CE RTC时钟模块架构解析与选型实战
架构·实时音视频
VortMall11 小时前
VortMall 微服务商城 v1.3.13 版本更新|『会员 + 分销』功能优化,提升私域裂变经营能力
微服务·云原生·架构
未来智慧谷12 小时前
从 Atlas 关停复盘:AI 应用的三种载体形态怎么选(独立应用 / 浏览器扩展 / 桌面宿主)
前端·人工智能·ai·架构·浏览器
MrDJun12 小时前
突破动态渲染与反爬限制:现代网页变更监控系统的架构演进与实践
架构
科技之门13 小时前
全维度权威检测背书,海悟液冷 CDU 双架构书写算力基础设施节能降碳答卷
架构
TunerT_TQ13 小时前
Valhalla 静态工程审阅 #004|MoonshotAI MoonEP 源码证据驱动评测【大厂开源基础设施特辑】
架构·github
半兽先生13 小时前
MinerU + LibreOffice 混合架构:搞定 .doc/.ppt 旧格式文档解析与切片
人工智能·python·机器学习·ai·架构
BerrySen17814 小时前
现代 C# 全栈与高性能编程实战指南:从 CLR 底层机制到 AI Agent 智能体架构
人工智能·架构·c#
国科安芯14 小时前
四通道集成降压稳压器在低轨卫星星座分布式供电架构中的应用研究
分布式·架构·电源管理系统·低轨卫星星座·分布式供电·dc-dc降压稳压器·抗辐射加固