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)解耦。这种模式可以让代码结构更清晰,模块间的依赖关系更松散,便于维护和扩展。
好书推荐
循序渐进Vue.js 3.x前端开发实践
《循序渐进Vue.js 3.x前端开发实践》由一位拥有丰富前端开发经验的架构师撰写,旨在通过详尽的理论知识讲解和丰富的实践练习,帮助初学者深入掌握Vue.js框架,并能够独立开发商业级别的Web应用程序。本书分为14章,内容涵盖Vue.js的基本概念、模板语法、组件使用、用户交互处理、动画效果实现、脚手架工具Vite的使用,以及如何利用UI框架Element Plus、网络请求框架Axios、路由管理框架Vue Router和状态管理框架Pinia等工具来构建商业级应用。最终章节通过一个完整的电商后台管理系统,对所学的知识进行综合运用,加深读者对Vue.js开发流程和技巧的理解,提高项目开发能力。