J*aScript依赖注入容器


依赖注入是通过外部注入依赖实现控制反转,提升解耦与可测试性;文中给出构造函数注入示例及简易DI容器实现,支持单例与瞬时生命周期管理,最后介绍使用场景与成熟库InversifyJS。

javascript依赖注入容器

J*aScript中的依赖注入(Dependency Injection, DI)容器是一种设计模式工具,用于管理对象之间的依赖关系,提升代码的可测试性、可维护性和解耦程度。在大型应用中,手动创建和管理依赖容易导致代码混乱,而DI容器能自动解析并注入所需依赖。

什么是依赖注入?

依赖注入的核心思想是:不主动在类内部创建依赖实例,而是由外部将依赖“注入”进来。这样可以实现控制反转(Inversion of Control, IoC),让模块之间更加松耦合。

常见的注入方式包括:

  • 构造函数注入:通过构造函数传入依赖
  • 属性注入:将依赖赋值给对象属性
  • 方法注入:通过方法参数传递依赖

为什么需要DI容器?

当项目变大,依赖层级加深时,手动管理依赖会变得繁琐且易错。DI容器的作用是:

ThinkPHP5.0完整版 ThinkPHP5.0完整版

ThinkPHP5.0版本是一个颠覆和重构版本,官方团队历时十月,倾注了大量的时间和精力,采用全新的架构思想,引入了更多的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持composer,并针对API开发做了大量的优化,包括路由、日志、异常、模型、数据库、模板引擎和验证等模块都已经重构,不适合原有3.2项目的升级,请慎重考虑商业项目升级,但绝对是新项目的首选(无论是WEB还是API

ThinkPHP5.0完整版 2228 查看详情 ThinkPHP5.0完整版
  • 自动解析依赖树,按需创建实例
  • 支持单例、瞬时等多种生命周期管理
  • 集中注册和配置服务,便于维护
  • 方便替换实现(如用mock替换真实服务进行测试)

一个简单的DI容器实现

下面是一个轻量级的DI容器示例,使用Map存储注册的服务,并支持构造函数注入:

class Container {
  constructor() {
    this.registry = new Map();
    this.instances = new Map(); // 缓存单例
  }

  register(name, ctor, lifecycle = 'singleton') {
    this.registry.set(name, { ctor, lifecycle });
    return this;
  }

  resolve(name) {
    if (!this.registry.has(name)) {
      throw new Error(`Service not registered: ${name}`);
    }

    const { ctor, lifecycle } = this.registry.get(name);

    if (lifecycle === 'singleton' && this.instances.has(name)) {
      return this.instances.get(name);
    }

    const instance = this._instantiate(ctor);
    
    if (lifecycle === 'singleton') {
      this.instances.set(name, instance);
    }

    return instance;
  }

  _instantiate(ctor) {
    const paramRegex = /constructor\s*\(\s*([^)]*)\)/;
    const argsStr = ctor.toString().match(paramRegex)?.[1] || '';
    const deps = argsStr.split(',').map(arg => arg.trim()).filter(Boolean);

    const dependencies = deps.map(dep => {
      if (!this.registry.has(dep)) {
        throw new Error(`Dependency not registered: ${dep}`);
      }
      return this.resolve(dep);
    });

    return Reflect.construct(ctor, dependencies);
  }
}

使用示例

假设我们有两个服务:Logger 和 UserService:

class Logger {
  log(msg) {
    console.log('[LOG]', msg);
  }
}

class UserService {
  constructor(Logger) {
    this.logger = Logger;
  }

  getUser(id) {
    this.logger.log(`Fetching user ${id}`);
    return { id, name: 'John Doe' };
  }
}

// 使用容器
const container = new Container();
container.register('Logger', Logger);
container.register('UserService', UserService);

const userService = container.resolve('UserService');
userService.getUser(1); // [LOG] Fetching user 1

基本上就这些。这个简易容器展示了DI的核心机制。实际项目中,也可以使用成熟的库,比如 InversifyJS,它支持装饰器、类型绑定和更复杂的场景,适合TypeScript项目。

以上就是J*aScript依赖注入容器的详细内容,更多请关注其它相关文章!


# 是由  # 京东网站营销推广方案  # 微店seo推广软件  # 梨洲街道网站优化推广  # 网站内页推广  # 网站建设张世勇  # seo是个职位吗  # 网站优化的八大误区  # 免费的国内产品推广网站  # 长沙企业网站建设系统  # 辽宁运营网站建设优势  # 中文网  # 相关文章  # 所需  # javascript  # 是一种  # 重构  # 键值  # 最短  # 表单  # 是一个  # red  # 为什么  # ai  # 工具  # typescript  # js  # java 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 夸克浏览器资源嗅探怎么用 夸克浏览器网页资源下载技巧【教程】  Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题  在Spring Boot Thymeleaf中利用布尔属性实现容器的条件显示  Win10如何关闭操作中心通知 Win10免打扰设置全攻略【清爽】  深入理解Python对象引用与链表属性赋值  J*aScript二进制处理_ArrayBuffer与Blob  小红书网页版怎么进 小红书网页版通用入口  Fedora怎么安装 Fedora Workstation安装步骤  小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】  谷歌学术论文搜索引擎 谷歌学术官网入口论坛永久链接  163邮箱在线登录 163邮箱网页版在线入口  QQ网站入口直接登录 QQ官方正版登录页面  驱动人生:游戏修复指南  lol小红书怎么|直播|?lol小红书|直播|是什么意思?  热血江湖归来医师加点攻略  苹果11如何更换iCloud账号_苹果11账号切换的具体步骤  Yandex浏览器官方入口_Yandex搜索引擎中文版  《海贝音乐》均衡器设置方法  PHP中获取HTTP响应状态消息:方法与限制  德邦快递会员怎么开通  windows10怎么设置电源按钮_windows10按下电源键功能修改  B站怎么开|直播| B站|直播|申请需要什么条件【新手必看】  韩小圈网页版PC端入口 韩小圈网页版官方网站入口  CodeIgniter 3 连接 SQL Server:正确获取查询结果的教程  如何使用 Optional 类型并满足 Pylint 的类型检查  Go反射进阶:访问内嵌结构体中的被遮蔽方法  重返未来:1999卡戎全方位攻略  以下哪一个是适应长期护理制度发展而设立的新职业  Mac hosts文件在哪里_Mac修改hosts文件详细教程  顺丰快递单号查询寄件人 顺丰寄件人查询入口  126邮箱申请入口官网_126邮箱注册免费登录2025  视频转蓝光m2ts格式  服装短视频如何起号推广?服装短视频起号推广有什么要求?  基于键值条件高效映射 Pandas DataFrame 多列数据  多多买菜门店端app订单查看方法  圆通快递包裹轨迹查询 圆通速递快件实时位置跟踪  Python实时数据流中高效查找最大最小值  邮编号码查询app有哪些_邮编号码查询推荐app及使用体验  繁花漫画使用教程  QQ阅读小说搜索入口地址_QQ阅读小说搜索入口地址搜索在线阅读  谷歌浏览器官方镜像获取方法_谷歌浏览器网页版入口极速直达  小红书网页版在线直达 小红书网页版免费登录入口  win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】  电脑“无法访问指定设备、路径或文件”怎么办?五种权限设置方法  如何测试您的网站全球打开速度-网站海外测速工  网站体验不好=浪费钱:如何提升-用户体验效果差  PHP动态导航按钮:根据用户登录状态切换链接与文本  鸿蒙单条备忘录如何加密  英国搜索:多数英国人认为语言搜索是未来搜索  mail.qq.com登录入口 QQ邮箱网页版直达 

 2025-10-17

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.