NestJS 的 Module 学习

Module 概念

模块使用@Module()装饰器来装饰的类。装饰器@Module()提供 NestJS 用于组织应用程序结构相关的数据,例如提供商和控制器等等。具体的结构图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T3CAmLIm-1690294965361)(./images/模块关系例子.png “模块关系例子”)]

每个应用程序至少有一个模块,即根模块

根模块是 NestJS 用于构建应用程序的起点,根模块也是用于解析模块和提供者关系依赖关系的内部数据结构图。

强烈建议将模块作为组织组件的有效方式。因此,对于大多数应用程序来说,最终的架构将采用多个模块,每个模块封装一组密切相关的功能。

@Module装饰器是一个对象,其属性具体如下:

属性属性说明
providers将由 Nest 注入器实例化的提供程序(提供者的注入),并且至少可以在该模块中共享
controllers该模块中定义的必须实例化的控制器集
imports导入通用的业务模块,例如缓存模块、日志模块等
exports导出该模块所需的提供程序,只有导出的模块才能够被引用

功能模块

功能模块只是组织与特定功能相关的代码,保持代码组织并建立清晰的边界。ControllerService在功能上是密切关联的,所以我们可以把他们多移入功能模块中进行管理。具体的实例如下:

import { Module } from "@nestjs/common";
import { CommodityController } from "../controller/commodity.controller";
import { CommodityService } from "../service/commodity.service";@Module({controllers: [CommodityController],providers: [CommodityService],
})
export class CommodityModule {}

在功能模块中声明了ControllerService后,就不必在app.module中声明,只是我们要把功能模块声明到这里,具体实例如下:

@Module({imports: [CommodityModule],controllers: [AppController],providers: [AppService],
})
export class AppModule {}

共享模块

在 NestJS 中,默认情况下模块是单例的,因此我们可以轻松地在多个模块之间共享任何一个实例。具体结构图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JHlQvqWY-1690294965363)(./images/共享模块.png “共享模块”)]

假设我们想要在几个模块之间共享CommodityService的实例,我们只需要使用exports属性就可以对外暴露实例,从而其他模块就可以使用。具体实例如下:

@Module({controllers: [CommodityController],providers: [CommodityService],exports: [CommodityService],
})
export class CommodityModule {}

现在,只要导入CommodityModule后就可以使用CommodityService的实例,并且这个 Service 实例都是共享同一个。具体的实例如下:

// module模块
@Module({imports: [CommodityModule], // app.module没有导入的话,这里是需要导入才可以实例化对应的提供者controllers: [AccountController],providers: [AccountService],
})
export class AccountModule {}// 控制器模块
@Controller("account")
export class AccountController {constructor(private commodityService: CommodityService,private accountService: AccountService) {}@Get("/info")getInfo(@Param() params: { id: string }) {const _commodity = this.commodityService.findById(params.id);return this.accountService.findById(_commodity?.id);}
}

模块重新导出(这里可能有理解上的错误,大佬们发现有错误的描述可以留言)

模块重新导出主要是暴露对应的所有方法。具体实例如下:

@Module({imports: [CommonModule],exports: [CommonModule],
})
export class CoreModule {}

上面这个例子主要是让CoreModule能够使用CommonModule里面所有注入的服务。

全局模块

当程序在各处需要导入相同的模块集时,我们可以使用全局装饰器@Global()来声明模块,这样模块就会变为全局可以访问的模块。具体实例如下:

import { Global, Module } from "@nestjs/common";
import { CommodityController } from "../controller/commodity.controller";
import { CommodityService } from "../service/commodity.service";@Global()
@Module({controllers: [CommodityController],providers: [CommodityService],exports: [CommodityService],
})
export class CommodityModule {}

全局装饰器使得模块范围变成全局访问,全局模块只是注册一次就可以,通常是由根模块或者核心模块进行注册。

注意一下几点:

  • 1、当我们把模块升级为全局模块后,我们就可以不用在用imports进行导入模块啦。
  • 2、全局模块还是需要使用exports导出提供者才行,要不然其他模块是不能使用到实例的。
  • 3、全局模块虽然可以减少部分代码量,但是这不是推荐的行为。

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

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

相关文章

【JS 同步调用多个函数 Promise.all】

在 JS 异步编程中,可以使用 Promise.all 方法来实现同步调用多个函数。 Promise.all 方法接收一个包含各个 Promise 对象的数组作为参数,返回一个新的 Promise 对象。当数组中所有的 Promise 对象都成功(即状态为 resolved)时&am…

【问题记录】Ubuntu 22.04 环境下,程序报:段错误(核心已转储)怎么使用 core 文件和GDB调试器 解决?

目录 环境 问题情况 解决思路 原因分析 解决方法 番外知识 环境 VMware Workstation 16 Pro (版本:16.1.2 build-17966106)ubuntu-22.04.2-desktop-amd64 问题情况 本人在运行百万并发的服务端程序时,程序运行报&#xff1a…

JVM运行时数据区——方法区的垃圾回收

方法区的垃圾回收主要是两部分:运行时常量池中废弃的常量和不在使用的类。 类卸载(将不在使用的类回收)的条件: 该类的所有实例均被回收。 加载该类的类加载器被回收(一般很难满足)。 类对象不再引用,通过反射也获取不到。

alias取别名后,另一个shell中和shell脚本中不生效的问题以及crontab执行docker失败问题

目录 问题一:用alias取别名后,另一个shell中不生效描述原因解决 问题二:用alias取别名后,别名在脚本中不生效描述原因解决 问题三:crontab计划任务不能运行docker命令描述原因解决 问题一:用alias取别名后&…

VLAN---虚拟局域网

VLAN— 虚拟局域网 LAN—局域网 MAN—城域网 WAN—广域网 1.一个VLAN相当于是一个广播域 VLAN—通过路由器和交换机协同工作后,将原本的一个广播域逻辑上,拆 分为多个虚拟的广播域。 VLAN配置: 1.创建VLAN VID—VLAN ID------用来区分和…

浅谈能源管理系统在水泥行业中设计分析

安科瑞 华楠 摘要:水泥企业作为我国产业结构中重要的耗能产业,同时对环境的污染也比较大,因此在水泥企业中建立能源管理系统,对水泥企业的生产过程过程进行全过程的监控和管理,对于降低企业的能源消耗和提高企业的经济…

【Ajax】笔记-Axios与函数发送AJAX请求

Axios 和 Ajax 的区别 1、Axios是一个基于Promise的HTTP库,而Ajax是对原生XHR的封装; 2、Ajax技术实现了局部数据的刷新,而Axios实现了对ajax的封装。 优缺点: ajax: 本身是针对MVC的编程,不符合现在前端MVVM的浪潮 基…

Rust中的Iterator和IntoIterator介绍及应用

Iterator即迭代器,它可以用于对数据结构进行迭代。被迭代的数据结构是可迭代的(iterable),所谓的可迭代就是这个数据结构有返回迭代器的方法,由于Rust的所有权机制,对一个数据结构的迭代器,有三种: 拿走数…

【MySQL】之复合查询

【MySQL】之复合查询 基本查询多表查询笛卡尔积自连接子查询单行子查询多行子查询多列子查询在from子句中使用子查询 合并查询小练习 基本查询 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J按照部门号升序而雇员的工资降序排序使用…

性能测试Ⅱ(压力测试与负载测试详解)

协议 性能理论:并发编程 ,系统调度,调度算法 监控 压力测试与负载测试的区别是什么? 负载测试 在被测系统上持续不断的增加压力,直到性能指标(响应时间等)超过预定指标或者某种资源(CPU&内存)使用已达到饱和状…

全志F1C200S嵌入式驱动开发(解决spi加载过慢的问题)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 之前的几个章节当中,我们陆续解决了spi-nor驱动的问题、uboot支持spi-nor的问题。按道理来说,下面要做的应该就是用uboot的loady命令把kernel、dtb、rootfs这些文件下载到ddr,然…

Mysql中日期时间的加减

Mysql中日期时间的加减,可以使用date_add()函数和date_sub()函数 1、date_add()为日期增加一个时间间隔 语法格式为: DATE_ADD(date,INTERVAL expr type) #date 指定的时间,可以是now(),也可以是其它时间 #INTERVAL 间隔关键字 #expr 添加…

WebRTC Simulcast介绍

原文地址👇 https://blog.livekit.io/an-introduction-to-webrtc-simulcast-6c5f1f6402eb/ 你想知道的关于Simulcast的一切 Simulcast是WebRTC中最酷的功能之一,它允许WebRTC会议在参与者网络连接不可预测的情况下进行扩展。在这篇文章中,我们将深入探讨Simulcas…

element ui input 深层循环v-model绑定默认数据删除不了的情况

例子&#xff1a; 在项目开发中遇到的&#xff0c;简单记录一下 <el-input style"width: 180px"v-model"item.dataForm"input"handleChangeDataForm($event)"type"number"placeholder"请输入1-2的数值"size"smal…

欧姆龙CX系列PLC串口转以太网欧姆龙cp1hplc以太网连接电脑

你是否还在为工厂设备信息采集困难而烦恼&#xff1f;捷米特JM-ETH-CX转以太网通讯处理器为你解决这个问题&#xff01; 捷米特JM-ETH-CX转以太网通讯处理器专门为满足工厂设备信息化需求而设计&#xff0c;可以用于欧姆龙多个系列PLC的太网数据采集&#xff0c;非常方便构建生…

【育儿】幼儿学习笔记 (一)

文章目录 [TOC] 一、前言二、2~6岁 目标三、1~3年级 目标学习内容校内校外 三、学习技巧表达结构表达方法板块化学习学习进度控制古诗词推荐 四、听文史类幼儿园小学 五、看 一、前言 语文、英语属于语言类学科 二、2~6岁 目标 听 ★★★★★ \color{Orange}{★★★★★} ★…

设计模式之责任链模式

// 定义请求类 class Request {private String content;public Request(String content) {this.content content;}public String getContent() {return content;} }// 抽象处理器 abstract class Handler {protected Handler successor; // 后继处理器public void setSuccesso…

Go语言channel

通道 通道&#xff08;channel&#xff09;是Go语言提供的一种在gorountine之间进行数据创术的通信机制。通道的声明非常简单&#xff0c;只需要使用chan 关键字即可&#xff0c;关闭则需要使用close函数。 注意&#xff1a;通过close函数关闭channel不是必须的。不主动关闭的…

java中list集合根据枚举类型排序

自定义枚举类 import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import java.util.Arrays; Getter NoArgsConstructor AllArgsConstructor public enum ProContant {QCC("QCC",1),FQCC("FQCC",2),HELIHUA(&quo…

4、非线性数据结构

上一节课我们讲了线性数据结构&#xff0c;这一节我们说下非线性数据结构。 非线性数据结构&#xff0c;从字面意思来看&#xff0c;就是指不是线性的结构。线性结构的特点是只有一个前驱和一个后继。 那么非线性结构的特点就是有多个前驱或后继了。 如果只存在一个没有前驱的…