【Nestjs】从入门到精通(依赖注入)

news2025/1/19 7:03:49

在这里插入图片描述

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开发流程和技巧的理解,提高项目开发能力。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2214116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态网站及爬虫技术应用(题目)

/*T26:HTTP响应消息的状态代码为500时表示( ): HTTP响应消息的状态代码为500时表示服务器内部错误(Internal Server Error)。这通常意味着服务器在处理请求时遇到了意外的情况,导致无法完成该请求。这种错误可能是由于…

操作系统Lesson - 5 进程简介及进程编程模型

文章目录 什么是进程同一程序如何并发? Linux进程常用命令proc目录 PCB进程控制块PCB包含的信息两个进程间的关系 进程编程exec() 替换函数子进程的运行过程 什么是进程 进程 程序运行的过程,系统进行资源管理和调度的独立单位。 程序由两部分组成&am…

基础入门-Web应用架构搭建漏洞HTTP数据包

网站搭建 这里给一个网站搭建的视频链接,之前又搞过搭建服务器,这里就不再重做了 https://www.bilibili.com/video/BV16A4y1X7vg/?spm_id_from333.337.search-card.all.click&vd_sourcec2c3c616b3ad1faf44a9f6f30a4dbb03 值得注意的是,…

网络通信与并发编程(二)基于tcp的套接字、基于udp的套接字、粘包现象

基于tcp的套接字 文章目录 基于tcp的套接字一、套接字的工作流程二、基于tcp的套接字通信三、基于udp的套接字通信四、粘包现象 一、套接字的工作流程 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个…

学习底座架构-武汉

1 学习底座架构概述 大脑学习中心-边缘系统 一、当下教育现状 二、什么是学习底座 三、学习底座价值 七、学习底座解决问题的流程 案例:以4R注意力为例 一 注意力问题解决流程 二 注意力问题的危害 三 衡量注意力水平高低的标准 四 注意力问题4大根源 & 2大诱因…

FPGA驱动HDMI 初级篇

简介 本章节主要讲述如何通过FPGA驱动HDMI显示。 本章节框图如下: bd框图中使用了两个IP核,分别是Video Timing controller核AXI4-Stream to video out两个模块,下面先对两个模块做介绍。 Video Timing controller 配置如下: 这里由于没有使用ZYNQ PS端,…

BKD树介绍、区别与联系

简介 BKD树(全称 bushy kd-trees)是一种用于高维数据搜索的数据结构。它结合了K-D树和B树的特点,旨在提高多维空间数据的索引和查询效率。 基本概念 BKD树是一种二叉树结构,类似于K-D树,但其设计更加注重空间利用率…

10.11Python数学基础-多维随机变量及其分布

多维随机变量及其分布 1.二维随机变量及其分布 假设E是随机试验,Ω是样本空间,X、Y是Ω的两个变量;(X,Y)就叫做二维随机变量或二维随机向量。X、Y来自同一个样本空间。 联合分布函数 F ( x , y ) P ( X ≤ x , Y ≤ y ) F(x,y)P(X≤x,Y≤…

SpringBoot+XXL-JOB:高效定时任务管理

前言 在现代应用程序中,定时任务是不可或缺的一部分。Spring Boot 和 XXL-Job 为你提供了一个强大的工具组合,以简化任务调度和管理。 本文将带领你探索如何将这两者集成在一起,实现高效的定时任务管理。无论你是初学者还是有经验的开发者&…

【进阶】面向对象之接口

文章目录 为什么要有接口如何定义和使用一个接口练习 接口里面的成员特点接口和类之间的关系 为什么要有接口 接口:就是一种规则 如何定义和使用一个接口 接口用关键字interface来定义 public interface 接口名{}接口不能实例化接口和类之间是实现关系,通过imple…

集合的基础操作

1.集合中元素没有顺序,且不会重复,输入的数据若有重复则会去重 2.集合的格式为:变量名{##,##,##} 3.集合中元素的添加格式为:变量名.add(添加的元素) 4.集合中元素的取出格式(取出元素后,原集合中该元素没有了&#…

软件测试学习笔记丨Linux三剑客-grep

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32506 一、简介 1.1 grep命令 grep是一个全局查找正则表达式,并且打印结果行的命令。grep的输入是一个文件或者一个标准输入(stdin),或者是一…

JAVA多线程实现

一、方法总结 Thread类的常用方法 void setName(String name)//将此线程的名称更改为name String getName()//如果不设置名称,则线程默认名称为Thread-0或Thread-1或…就是Thread -? String Thread.currentThread().getName()//获得当前线程名称 …

C++常见的内存错误和解决策略

目录 1.未初始化指针 (Uninitialized Pointer) 2.内存分配未成功却使用了它 3.野指针 (Dangling Pointer) 4.内存泄漏 (Memory Leak) 5.重复释放内存 (Double Free) 6.内存越界访问 (Buffer Overflow) 7.错误的数组删除方式 (Mismatched Delete) 8.栈内存溢出 (Stack O…

24/10/14 算法笔记 循环神经网络RNN

RNN: 一种专门用于处理序列数据的神经网络,它能够捕捉时间序列中的动态特征。RNN的核心特点是其循环连接,这允许网络在不同时间步之间传递信息,从而实现对序列数据的记忆和处理能力。 应用的场景: 自然语言处理(NLP&…

这款懂人情世故的大模型强得可怕!

这款孵化于首期书生大模型实战营,基于 InternLM2 开发的项目——天机,更懂人情世故的大模型,这 2 天在社区可谓有点火!相关内容在小红书上至少收获了六千多点赞与收藏 ! 你是否还在苦苦挣扎于各种应酬,四处寻找“高情商…

MySQL-04.DDL-数据库操作

一.数据库的操作 DDL(data definition language):数据定义语言,用来定义数据库对象(数据库、表) DDL分为两类:1.数据库的DDL语句,主要是针对数据库的定义,增加,删除,使用 2.表结构的DDL语句&…

大数据-160 Apache Kylin 构建Cube 按照日期构建Cube 详细记录

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

TuyaOS开发学习笔记(4)——BLE开发搭建环境、编译烧写(NRF52832)

一、搭建环境 1.1 官方资料 TuyaOS 1.2 安装Visual Studio Code 官网下载:https://code.visualstudio.com 百度网盘:https://pan.baidu.com/s/1R62HT0PVmVzMwOXtCmIQwA 提取码:g9fb 1.3 安装Tuya Wind IDE 启动 Visual Studio Code 后&am…

windows10 输入法突然变成繁体字。

1.在任务栏的输入法上切换到设置页面 2. 进入语言选项 3.浮动在桌面上? 4. 点击繁体或简体切换。