JavaScript中的依赖注入:初学者完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

JavaScript中的依赖注入:是什么以及为什么需要它



在现代 JavaScript (Node.js) 开发世界中,代码的清晰度和可维护性变得至关重要。帮助实现这一目标的关键原则之一是 依赖注入 (DI)。本文专为初学者编写,旨在通过实际示例用通俗易懂的语言解释这一概念。



想象一下你在组装一台电脑。与其将显卡永久焊接到主板上,不如使用 PCI-E 插槽。这样,你可以轻松地将显卡更换为更强大的型号,或者使用另一块显卡进行测试。依赖注入 的工作原理与此相同:你不在类内部创建依赖关系(不将其“焊接”进去),而是从外部传入它们。



没有依赖注入的问题



考虑一个典型的 Node.js 示例,其中代码变得高度耦合:



class Logger {    log(message) {        console.log(`[LOG]: ${message}`);    }}

class UserService { constructor() { this.logger = new Logger(); // 硬依赖 }

createUser(name) { this.logger.log(`用户已创建: ${name}`); // 创建用户的逻辑 }}

const service = new UserService();service.createUser('安娜');


在这里,UserService 自己创建了 Logger 的实例。如果我们想将 console.log 替换为写入文件或数据库,就必须修改 UserService 的代码。这违反了 SOLID 中的 开闭原则。



JavaScript中依赖注入的基础知识



什么是依赖注入?



依赖注入 (DI) 是一种设计模式,其中对象从外部源获取其依赖关系,而不是自行创建它们。在 JavaScript 的上下文中,这意味着通过构造函数、setter 或方法参数传递依赖关系。



三种主要的依赖注入方式



在 JavaScript 和 Node.js 中,有三种方法:



  • 构造函数注入: 依赖关系通过类的构造函数传递。
  • Setter 注入: 依赖关系通过单独的方法(setter)设置。
  • 方法注入: 依赖关系直接传递给使用它们的方法。


最流行且推荐的方法是 构造函数注入,因为它使依赖关系显式化,并且在对象创建后不可更改。



Node.js中依赖注入的实践示例



示例 1:构造函数注入



让我们使用 依赖注入 重写我们的示例:



class Logger {    log(message) {        console.log(`[LOG]: ${message}`);    }}

class FileLogger { log(message) { // 模拟写入文件 console.log(`[FILE]: ${message}`); }}

class UserService { constructor(logger) { this.logger = logger; // 依赖关系从外部传入 }

createUser(name) { this.logger.log(`用户已创建: ${name}`); // 创建用户的逻辑 }}

// 使用不同的日志记录器const consoleLogger = new Logger();const fileLogger = new FileLogger();

const serviceWithConsole = new UserService(consoleLogger);serviceWithConsole.createUser('安娜'); // [LOG]: 用户已创建: 安娜

const serviceWithFile = new UserService(fileLogger);serviceWithFile.createUser('伊万'); // [FILE]: 用户已创建: 伊万


现在,UserService 不知道具体使用的是哪个日志记录器。我们

博客

书籍推荐