news 2026/5/11 15:55:32

DDD | 依赖倒置到底是个啥?真的有必要吗?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DDD | 依赖倒置到底是个啥?真的有必要吗?

关注我的公众号,获取独家技术分享和资料

一、先讲个故事:老王开饭店

老王开了一家饭店,雇了个厨师叫小李。

最初的做法(直接依赖):

老王的饭店所有菜单、流程、采购都是围绕小李来设计的。

小李喜欢用铁锅,老王就买铁锅;小李习惯早上8点到,老王就8点开门。

问题来了:

  • 小李要回老家了,饭店怎么办?

  • 找个新厨师小张,但小张用不惯铁锅,喜欢用不粘锅...

  • 老王不得不把厨房重新装修一遍!

这就是直接依赖带来的问题:高层(饭店)被低层(具体的厨师)绑架了


二、依赖倒置是怎么解决的?

老王学聪明了,他定了一个"厨师岗位规范":

规范里写着:

  • 必须会做本店菜单上的菜

  • 早上7:30到岗

  • 会用店里提供的标准厨具

现在,不管是小李、小张还是小王,只要符合这个规范,都能来老王店里上班。老王的饭店不再依赖某个具体的厨师,而是依赖于一个抽象的规范

这就是依赖倒置的核心思想:

高层模块不应该依赖低层模块,两者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

用人话说就是:老板别盯着具体的人,要盯着岗位说明书


三、代码世界里的依赖倒置

错误示范:直接依赖

// 订单服务直接依赖MySQL public class OrderService { private MySQLOrderRepository repository = new MySQLOrderRepository(); public void createOrder(Order order) { repository.save(order); } }

问题:哪天老板说要换成 PostgreSQL,你得改 OrderService;要换成 MongoDB?再改一遍...

正确示范:依赖倒置

// 定义抽象(接口) publicinterface OrderRepository { void save(Order order); } // 高层模块依赖抽象 publicclass OrderService { private OrderRepository repository; // 依赖接口,不依赖具体实现 public OrderService(OrderRepository repository) { this.repository = repository; } public void createOrder(Order order) { repository.save(order); } } // 具体实现也依赖抽象 publicclass MySQLOrderRepository implements OrderRepository { public void save(Order order) { /* MySQL实现 */ } } publicclass MongoOrderRepository implements OrderRepository { public void save(Order order) { /* MongoDB实现 */ } }

现在换数据库?只需要:

// 用MySQL OrderService service = new OrderService(new MySQLOrderRepository()); // 换MongoDB OrderService service = new OrderService(new MongoOrderRepository());

OrderService 一行代码都不用改!


四、在DDD中,依赖倒置有多重要?

在领域驱动设计(DDD)中,依赖倒置简直是灵魂级别的存在。

DDD的分层架构

┌─────────────────────────────────────┐ │ 用户接口层 │ ├─────────────────────────────────────┤ │ 应用服务层 │ ├─────────────────────────────────────┤ │ ★ 领域层(核心业务逻辑)★ │ ← 这是老大! ├─────────────────────────────────────┤ │ 基础设施层 │ ← 数据库、消息队列、第三方服务等 └─────────────────────────────────────┘

传统做法的问题:

领域层要存订单,直接调用基础设施层的 MySQLRepository。结果呢?

  • 核心业务代码里混入了数据库操作细节

  • 想换个存储方案?业务代码全得改

  • 写单元测试?先给我起个数据库再说...

依赖倒置后:

领域层定义: interface OrderRepository { save(order); } 基础设施层实现: class MySQLOrderRepository implements OrderRepository
  • 领域层只关心"我需要能存订单"这个能力

  • 至于用MySQL还是Redis,领域层根本不care

  • 测试时换个内存实现就行,秒测

这才是DDD要的效果:让领域模型成为真正的核心,不被技术细节污染。


五、依赖倒置是必须的吗?

说实话,不是

什么时候可以不用?

  1. 简单的CRUD项目

    • 就是增删改查,业务逻辑简单

    • 数据库基本不可能换

    • 团队就两三个人,沟通成本低

  2. 一次性项目

    • 临时性的工具脚本

    • 用完即弃的演示项目

  3. 性能极致要求

    • 某些场景抽象层会带来微小开销

    • 但说实话,99%的项目瓶颈不在这

什么时候必须用?

  1. 业务复杂度高的系统

    • 电商、金融、供应链等

    • 业务规则多,变化快

  2. 需要长期维护的项目

    • 预期生命周期3年以上

    • 团队会不断更换

  3. 有明确的技术选型不确定性

    • 今天用MySQL,明天可能要迁移

    • 今天用短信验证码,明天可能换人脸识别

  4. 需要高质量测试覆盖

    • 没有依赖倒置,很多单元测试根本写不了


六、依赖倒置的代价

既然依赖倒置有那么多好处,那有哪些代价呢:

代价

说明

代码量增加

多了接口、多了注入逻辑

理解成本

初级开发者可能绕晕

过度设计风险

简单问题复杂化

调试困难

依赖关系不够直观

架构师的价值就在于:在正确的场景做正确的选择。


七、总结

一句话总结依赖倒置

别让你的核心业务代码依赖具体的技术实现,而是让技术实现来适配你的业务需求。

形象比喻

  • USB接口:电脑不关心你插的是鼠标还是键盘,只要符合USB规范

  • 220V插座:插座不关心你接的是电视还是冰箱,只要是220V的插头

  • 招聘JD:公司不关心谁来应聘,只要符合岗位要求

最终建议

依赖倒置不是银弹,但在中大型项目、复杂业务场景、长期维护的系统中,它几乎是必选项


📝记住:好的架构不是一开始就完美的,而是在正确的时机做出正确的权衡。依赖倒置只是工具而已。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 20:02:00

2025年企业自动化革命:零成本开源RPA的实战应用指南

2025年企业自动化革命:零成本开源RPA的实战应用指南 【免费下载链接】openrpa Free Open Source Enterprise Grade RPA 项目地址: https://gitcode.com/gh_mirrors/op/openrpa 在当前数字化转型浪潮中,开源RPA技术正在彻底改变企业的工作方式。Op…

作者头像 李华
网站建设 2026/5/4 5:54:31

深度启动盘制作终极指南:完全掌握Deepin Boot Maker使用技巧

深度启动盘制作终极指南:完全掌握Deepin Boot Maker使用技巧 【免费下载链接】deepin-boot-maker 项目地址: https://gitcode.com/gh_mirrors/de/deepin-boot-maker 还在为系统重装或系统救援而烦恼吗?深度启动盘制作工具(Deepin Boo…

作者头像 李华
网站建设 2026/5/3 17:27:57

BetterNCM安装程序深度解析:从源码到部署的完整指南

作为网易云音乐生态的重要增强工具,BetterNCM通过其专业的安装程序为开发者提供了完整的软件分发方案。该项目基于Rust语言构建,采用模块化架构设计,确保安装过程的稳定性和可扩展性。 【免费下载链接】BetterNCM-Installer 一键安装 Better …

作者头像 李华
网站建设 2026/5/9 17:52:15

设计语言零障碍:Figma中文插件如何彻底改变你的工作流

当专业的设计工具遭遇语言壁垒,创意表达是否会因此受限?对于众多国内设计师而言,Figma英文界面带来的学习曲线往往成为工作效率的隐形阻碍。今天,我们将深入探讨一款能够打破这一困境的利器——Figma中文插件,看看它是…

作者头像 李华
网站建设 2026/5/11 7:22:39

5分钟搞定:FF14动画跳过插件终极安装指南

对于《最终幻想XIV》玩家来说,重复观看副本动画是影响游戏效率的重要因素。FF14动画跳过插件作为一款专业的ACT辅助工具,能够智能识别并自动跳过特定副本的过场动画,让您的游戏体验更加流畅高效。这款FF14副本效率工具特别适合需要反复攻略冬…

作者头像 李华
网站建设 2026/5/11 7:22:40

如何快速配置BetterNCM安装器:网易云音乐插件增强完整指南

如何快速配置BetterNCM安装器:网易云音乐插件增强完整指南 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 想要让你的网易云音乐播放器拥有更多个性化功能吗?Be…

作者头像 李华