0

0

如何利用 JavaScript 实现一个简单的依赖注入容器来管理模块依赖?

紅蓮之龍

紅蓮之龍

发布时间:2025-09-27 08:49:01

|

323人浏览过

|

来源于php中文网

原创

依赖注入容器通过注册和解析依赖实现解耦,支持常量、工厂函数和服务类的注册;2. 容器可扩展为支持单例模式,避免重复创建实例;3. 适用于小型项目或学习DI原理,实际中可结合TypeScript、配置文件或框架集成以提升可维护性。

如何利用 javascript 实现一个简单的依赖注入容器来管理模块依赖?

依赖注入(Dependency Injection, DI)是一种设计模式,用于解耦模块之间的依赖关系。通过一个容器来管理对象的创建和依赖注入,可以让代码更易于测试、维护和扩展。在 JavaScript 中,我们可以用一个简单的类来实现一个轻量级的依赖注入容器。

1. 定义依赖注入容器的基本结构

创建一个 Container 类,用来注册、解析和管理依赖。核心方法包括:

  • register(key, resolver):将依赖以键值对形式注册到容器中
  • resolve(key):根据键获取并实例化依赖
示例代码:
class Container {
  constructor() {
    this._registry = new Map();
  }

  register(key, resolver) {
    this._registry.set(key, resolver);
  }

  resolve(key) {
    if (!this._registry.has(key)) {
      throw new Error(`No dependency registered for key: ${key}`);
    }

    const resolver = this._registry.get(key);
    return typeof resolver === 'function' ? resolver(this) : resolver;
  }
}

2. 注册不同类型的依赖

支持注册常量值、工厂函数或服务类。容器会根据类型决定如何处理。

  • 常量:直接存储值
  • 工厂函数:调用函数时传入容器,便于内部 resolve 其他依赖
使用示例:
// 假设有两个服务
class Logger {
  log(msg) {
    console.log(`[LOG] ${msg}`);
  }
}

class UserService {
  constructor(container) {
    this.logger = container.resolve('logger');
  }

  createUser(name) {
    this.logger.log(`Creating user: ${name}`);
    return { id: Date.now(), name };
  }
}

// 使用容器注册
const container = new Container();

container.register('logger', () => new Logger());
container.register('userService', (container) => new UserService(container));

// 解析使用
const userService = container.resolve('userService');
userService.createUser('Alice');

3. 支持单例模式(可选优化)

某些服务应全局唯一,比如数据库连接或日志器。可以在注册时标记为单例,首次创建后缓存实例。

Designs.ai
Designs.ai

AI设计工具

下载

立即学习Java免费学习笔记(深入)”;

增强 register 方法:
class Container {
  constructor() {
    this._registry = new Map();
    this._instances = new Map(); // 缓存单例
  }

  register(key, resolver, singleton = false) {
    this._registry.set(key, { resolver, singleton });
  }

  resolve(key) {
    if (!this._registry.has(key)) {
      throw new Error(`No dependency registered for key: ${key}`);
    }

    const { resolver, singleton } = this._registry.get(key);

    if (singleton && this._instances.has(key)) {
      return this._instances.get(key);
    }

    const value = typeof resolver === 'function' ? resolver(this) : resolver;
    if (singleton) {
      this._instances.set(key, value);
    }

    return value;
  }
}
注册单例服务:
container.register('logger', () => new Logger(), true);
container.register('userService', (container) => new UserService(container), true);

4. 实际应用场景建议

这种简易容器适合小型项目或学习理解 DI 原理。在实际开发中,你可以:

  • 通过配置文件批量注册服务
  • 添加依赖作用域(如请求级、应用级)
  • 结合 TypeScript 提供类型提示
  • 在框架中集成(如 Express 中间件注入)
基本上就这些。不复杂但容易忽略的是:确保依赖构造函数接收容器,以便内部能 resolve 其他服务。这样才真正实现自动装配。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

178

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

215

2025.12.18

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1501

2023.10.24

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

358

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2082

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

349

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

256

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

326

2023.10.09

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号