NestJS 是一个基于 Node.js 的渐进式框架,构建在 Express 或 Fastify 之上,主要用于构建高效、可扩展的服务器端应用程序。它使用 TypeScript 并借鉴了 Angular 的设计理念,采用了依赖注入(IoC, Inversion of Control)的模式,这使得 NestJS 具有高度模块化和松耦合的特性。
在 NestJS 中,依赖注入(DI, Dependency Injection)是通过 IoC 容器实现的。这个 IoC 容器负责实例化和管理类的依赖关系,从而提高代码的灵活性和可维护性。
class A {
name: string;
constructor(name: string) {
this.name = name;
}
}
class B {
a: A
constructor() {
this.a = new A("李四");
}
}
class C {
a: A
constructor() {
this.a = new A("王五");
}
}
const b = new B();
console.log(b.a.name); // 输出: 李四
const c = new C();
console.log(c.a.name); // 输出: 王五
这里B、C 高度依赖A,B、C实例化的同时会把A实例化,动作是B、C发出的。
使用中间件解耦实例
通过创建 Container 类来解耦实例,并通过 G 类从 Container 中获取这些实例。这是一种简单的依赖注入模式,常用于大型项目中,以保持模块之间的松耦合。
class E {
name: string;
constructor(name: string) {
this.name = name;
}
}
class F {
name: string | number; // 保留原来的声明
constructor(name: string | number) {
this.name = name;
}
}
//中间件用于解耦
class Container {
modeuls: any
constructor() {
this.modeuls = {
}
}
provide(key: string, modeuls: any) {
this.modeuls[key] = modeuls
}
get(key) {
return this.modeuls[key]
}
}
const con = new Container();
con.provide("name", new E("张三"));
con.provide("age", new F(1));
console.log(con.get("name")); // 输出: E { name: '张三' }
console.log(con.get("age")); // 输出: F { name: 1 }
class G {
a:any;
b:any;
constructor(container:Container){
this.a = con.get("name")
this.b = con.get("age")
}
}
const g = new G(con);
console.log(g)
//G { a: E { name: '张三' }, b: F { name: 1 } }
解释:
- 通过 con.provide(“name”, new E(“张三”)),你将一个 E 的实例存储在 Container 中,并以 name 作为键。类似地,你通过 con.provide(“age”, new F(1)) 存储了 F 的实例。
- 然后通过 con.get(“name”) 和 con.get(“age”) 可以取回这些实例。
- G 类通过 container 对象获取 name 和 age 对应的实例,并将它们赋值给 a 和 b,从而保持类 G 与具体模块(E 和 F)之间的解耦。
总结:
这种设计模式利用 Container 类管理依赖,将 G 类与具体的模块类(E 和 F)解耦。这种模式可以让代码结构更清晰,模块间的依赖关系更松散,便于维护和扩展。
好书推荐
JavaScript前端开发与实例教程
JavaScript是开发Web前端必须掌握的编程语言,《JavaScript前端开发案例教程:微课视频版》以真实的项目需求为导向,循序渐进、深入浅出地讲解JavaScript开发技术。每章均由知识点讲解、案例实践、面试题和学科竞赛题四部分组成,并配套提供案例源代码、PPT课件、课后习题答案、微课视频、教案、教学大纲、课程实训、期末考试试卷、章节测试、实验报告、学习通共享课程、学科竞赛真题等丰富的教学资源。
《JavaScript前端开发案例教程:微课视频版》共分13章,主要内容包括JavaScript概述、语法基础、数组、函数、对象、DOM、事件处理、BOM、JavaScript特效综合实例、Ajax、基于Ajax+ECharts的天气预报系统、ES6、基于ES6的文创商城等,并提供了重污染天气预警、“2048”游戏、“渔夫打鱼晒网”程序设计、“扫雷”游戏、高亮显示关键词、留言板、折叠面板、浮现社会主义核心价值观内容、事件监听器、限时秒杀、电影购票、在线网盘、轮播图、网络购物车、放大镜等大量实例。
《JavaScript前端开发案例教程:微课视频版》适合JavaScript初学者、Web前端开发人员阅读,也可作为高等院校Web前端开发、JavaScript程序设计、跨平台脚本开发、动态网页脚本技术等相关课程的教材。