当前位置: 首页 > ai >正文

依赖注入(DI)/控制反转(IoC) nodejs案例详解

前置知识

Reflect API

官方文档:reflect-metadata

举个例子介绍常用的 API:

@Reflect.metadata('key', 'value')
class Person {name: string;constructor(public age: number) {}
}Reflect.getMetadata('design:type', Person.prototype, 'name');
// 作用:获取元数据键对应的元数据值,design:type表示参数类型
// 输出: [Function: String]
// 参数:(元数据键, 类构造函数/对象, 属性名【可选】)Reflect.defineMetadata('custom:tag', 'VIP', Person.prototype, 'name');
console.log(Reflect.getMetadata('custom:tag', Person.prototype, 'name'));
// 作用:定义元数据键对应的元数据值
// 输出: VIP
// 参数:(元数据键, 值, 类构造函数/对象, 属性名【可选】)Reflect.getOwnMetadataKeys(Person.prototype, 'name');
// 作用:获取元数据键
// 输出: ['design:type', 'custom:tag']
// 参数:(类构造函数/对象, 属性名【可选】)

装饰器

类装饰器

//添加日志打印
function Log(){return function (target) {return class extends target {constructor(...args) {console.log('log')super(...args)}}}
}
//修改构造函数,实现单例模式
function Singleton() {return function (target) {return class extends target {private static instance: any;constructor(...args: any[]) {if (Singleton.instance) {return Singleton.instance;}super(...args);Singleton.instance = this;}};};
}@Log()
@Singleton()
class Database {constructor(private connectionString: string) {}
}
const db1 = new Database("db://localhost"); // 打印log
const db2 = new Database("db://localhost/another"); // 打印log
console.log(db1 === db2); // true

方法装饰器

// 权限验证装饰器
function Authenticated() {// 参数:target: 类的原型,propertyKey: 方法名,descriptor: 方法描述符,包含get/set/value/writable/configurable等属性return function (target, propertyKey, descriptor) {const originalMethod =
http://www.xdnf.cn/news/9313.html

相关文章:

  • 「提效」AI办公 | 实测,飞书扣子空间快速迭代
  • 网络常识:网线和光纤的区别
  • SD卡+FATFS+Tinyjpeg图片解码显示 (STM32F103VET6通过CubeMX快速建立工程)
  • NAT的映射类型详解:从基础到高级应用
  • 上海市计算机学会竞赛平台2025年5月月赛丙组稳定区间
  • 计算机视觉---YOLOv3
  • 5.0.7 TabControl的使用
  • 如何创建一个流程图/思维导图
  • 3分钟学会跨浏览器富文本编辑器开发:精准光标定位+内容插入(附完整代码)
  • MATLAB使用多个扇形颜色变化表示空间一个点的多种数值
  • STM32CubeMX,arm-none-eabi-gcc简单试用
  • MybatisPlus - Interceptor(拦截器)的功能点
  • AWS创建github相关的角色
  • Debian 系统 Python 开发全解析:从环境搭建到项目实战
  • Conda:环境移植及更新1--使用conda-pack
  • 永磁同步电机控制算法--基于电磁转矩反馈补偿的新型IP调节器
  • OpenCv高阶(十八)——dlib人脸检测与识别
  • Java设计模式之职责链模式详解
  • Sql Server TLSv1 协议问题
  • 机器学习算法-决策树
  • 【CSS】CSS 和 SASS 的区别
  • 【排序算法】快速排序详解--附详细流程代码
  • 鸿蒙 Form Kit(卡片开发服务)
  • 【AI论文】使用检索和代码工具将LLM Agent提取为小型模型
  • python打卡day38@浙大疏锦行
  • ROS学习 进程通信 nodelet
  • 预约按摩小程序源码介绍
  • java集合面试
  • 大语言模型 21 - MCP 自动操作 Figma+Cursor 实现自动原型开发!
  • 2025年该如何备考交安C证呢?