新闻中心
使用J*aScript实现一个简单的依赖注入_js架构
答案:依赖注入容器通过外部传入依赖实现解耦,J*aScript 实现包含注册、解析功能,支持单例与嵌套依赖,可管理类或函数服务。

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


2025-11-04
浏览次数:次
返回列表