新闻中心

使用J*aScript实现一个简单的依赖注入_js架构

2025-11-04
浏览次数:
返回列表
答案:依赖注入容器通过外部传入依赖实现解耦,J*aScript 实现包含注册、解析功能,支持单例与嵌套依赖,可管理类或函数服务。

使用javascript实现一个简单的依赖注入_js架构

依赖注入(Dependency Injection, DI)是一种设计模式,用于实现控制反转(IoC),让对象的依赖由外部传入,而不是在内部创建。这种方式提高了代码的可测试性、灵活性和解耦程度。下面用 J*aScript 实现一个简单的依赖注入容器。

1. 实现一个基础的依赖注入容器

我们创建一个 Container 类,用来注册、解析和管理依赖。

class Container {
  constructor() {
    this.dependencies = {};
  }

  // 注册依赖
  register(name, dependency, singleton = false) {
    this.dependencies[name] = {
      factory: typeof dependency === 'function' ? dependency : () => dependency,
      singleton,
      instance: null
    };
  }

  // 解析依赖(获取实例)
  resolve(name) {
    const dep = this.dependencies[name];
    if (!dep) {
      throw new Error(`Dependency not found: ${name}`);
    }

    if (dep.singleton && dep.instance) {
      return dep.instance;
    }

    const instance = dep.factory(this); // 把 container 传进去,支持依赖嵌套
    if (dep.singleton) {
      dep.instance = instance;
    }
    return instance;
  }

  // 清除某个依赖或全部依赖(用于测试)
  clear(name) {
    if (name) {
      delete this.dependencies[name];
    } else {
      this.dependencies = {};
    }
  }
}

2. 定义服务类

我们定义几个简单的服务来演示依赖关系。

// 日志服务
function Logger() {
  return {
    log: (msg) => console.log(`[LOG] ${msg}`)
  };
}

// 数据服务,依赖 Logger
function DataService(container) {
  const logger = container.resolve('logger');
  return {
    getData: () => {
      logger.log('Fetching data...');
      return ['item1', 'item2'];
    }
  };
}

// 用户服务,依赖 DataService
function UserService(container) {
  const dataService = container.resolve('dataService');
  const logger = container.resolve('logger');
  return {
    getUserData: () => {
      logger.log('Getting user data');
      return dataService.getData();
    }
  };
}

3. 使用容器注册并解析依赖

现在我们使用容器来注册服务,并获取实例。

mallcloud商城 mallcloud商城

mallcloud商城基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离vue的企业级微服务敏捷开发系统架构。并引入组件化的思想实现高内聚低耦合,项目代码简洁注释丰富上手容易,适合学习和企业中使用。真正实现了基于RBAC、jwt和oauth2的无状态统一权限认证的解决方案,面向互联网设计同时适合B端和C端用户,支持CI/CD多环境部署,并提

mallcloud商城 0 查看详情 mallcloud商城

const container = new Container();

container.register('logger', Logger, true);
container.register('dataService', DataService, true);
container.register('userService', UserService, true);

// 解析顶层服务,自动触发依赖加载
const userService = container.resolve('userService');
console.log(userService.getUserData());
// 输出:
// [LOG] Getting user data
// [LOG] Fetching data...
// ['item1', 'item2']

4. 支持构造函数或 class 的写法

如果使用 class,也可以适配。只需要 factory 返回 new 实例即可。

class ApiClient {
  constructor(logger) {
    this.logger = logger;
  }
  fetch() {
    this.logger.log('API request sent');
    return { success: true };
  }
}

// 注册时传入工厂函数
container.register('apiClient', (container) => {
  const logger = container.resolve('logger');
  return new ApiClient(logger);
}, true);

基本上就这些。这个简易的 DI 容器支持:

  • 注册值、函数、对象
  • 单例模式控制
  • 依赖自动解析与传递 container 上下文
  • 支持 class 和 function 构造的服务

不复杂但容易忽略的是:把 container 作为参数传给 factory,这样内部才能 resolve 其他依赖。

以上就是使用J*aScript实现一个简单的依赖注入_js架构的详细内容,更多请关注其它相关文章!


# 互联网  # 锦江网站seo性价比高  # 卫辉seo网站快速排名  # 推广营销最好的方法  # 惠阳网站外链优化  # 南宁营销推广方式  # 岳阳网站建设咨询公司  # 认识网站建设与维护  # 薯条的营销推广方案策划  # 佰宏crm推广营销  # 景德镇网站优化注意事项  # 是一种  # javascript  # 几个  # 的是  # 如何用  # 多线程  # 用它  # 可选  # 数据结构  # 有哪些  # ai  # js  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 快速CSGO开箱网站指南 CSGO开箱平台推荐  CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题  利用5118提升短视频内容效果_5118短视频关键词优化方法  提升Kafka消费者健壮性:会话超时处理与消息处理语义  ArrayList与LinkedList操作复杂度详解:遍历与修改  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】  J*aScript Promise链中如何正确终止后续.then执行并处理错误  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  126邮箱网页版官方入口 126邮箱账号在线登录平台  抖音从哪里进入网页版_抖音官方入口链接  斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程  构建轻量级网站内部消息系统:Formspree 集成指南  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  “音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!  163邮箱注册官网 免费申请163个人邮箱  Lar*el DB::listen 事件中的查询执行时间单位解析  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法  Python大型XML文件高效流式解析教程  如何在J*a中使用Locale处理多语言环境  支付宝如何设置安全保护_支付宝安全设置的全面教程  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作  小红书网页版入口链接分享 小红书官网直接进  解决Flask中Quill编辑器内容提交失败及TypeError的指南  J*aScript map 迭代中检测空数组元素的有效方法  QQ邮箱正确登录入口_QQ邮箱官方网站使用地址  Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】  韩小圈电脑版在线入口_网页版免费登录地址  C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入  顺丰快递查单号物流信息 顺丰快递小程序查询入口  知音漫客官网漫画下载_知音漫客网页版阅读记录  c++如何实现单例设计模式_c++线程安全的单例模式写法  必由学官网快捷入口 必由学网页版在线学习平台  J*aScript中正确使用querySelectorAll与复杂CSS选择器  优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率  Win11怎么修改默认浏览器_Windows 11设置Chrome为默认  QQ网页版官方账号入口 QQ网页版网页版登录指南  韩剧圈正版入口页面_韩剧圈官网登录链接  深入理解J*aScript Promise异步执行与微任务队列  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程  AO3镜像入口大全 AO3网页版内容访问全集  圆通快递查询实时追踪 圆通物流包裹状态快速查看  聚水潭ERP登录页面入口 聚水潭ERP官网登录界面  C#中解析不规范的HTML为XML 常见的坑与解决办法  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道  sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南 

搜索