NestJS 的 提供者 学习

news2024/11/17 23:43:49

提供者的基本概念

在 NestJs 中有一个提供者的概念,提供者可以是服务、缓存、工厂、数据库连接等。

提供者的主要思想就是它可以作为依赖注入项注入到需要使用的地方,这样我们就可以根据业务需求和自己的想法来组建业务功能组件从而让开发的灵活性大大提高,并且这些提供者的实例我们可以委托为 NestJs 来帮我们运行。

提供者的关系例子如下图(官方例子):

在这里插入图片描述

在上一章节中我们创建了一个commodity.controller控制器,而这个控制器应该负责 HTTP 请求的处理,复杂的业务处理应该交给提供者,其实提供者就是一个普通的 JavaScript 类。

服务

先让我们创建一个简单的CommodityService服务类,该服务主要是负责数据的添加和查询操作,并且我们首先先把此服务注入到app.module里面,后续我们再介绍 module 的使用。具体例子如下:

import { Injectable } from "@nestjs/common";
import { Commodity } from "../interfaces/commodity.interface";

@Injectable()
export class CommodityService {
  private readonly commoditys: Commodity[] = [];

  create(commodity: Commodity) {
    this.commoditys.push(commodity);
  }

  findAll(): Commodity[] {
    return this.commoditys;
  }

  findById(id: string) {
    return this.commoditys.find((item: Commodity) => item.id === id);
  }
}
// app.module.ts
@Module({
  controllers: [AppController, CommodityController],
  providers: [AppService, CommodityService],
})
export class AppModule {}

这个CommodityService类其实就是一个基本类,具有一个属性和三个方法。

我们使用@Injectable()装饰器来声明元数据,元数据声明就是让Nest IoC来管理我们的服务类。

在上述的例子中,我们还是定义了一个接口用来声明商品的实例属性,具体实例如下:

export interface Commodity {
  id: string;
  name: string;
  type: string;
  price: number;
  describe: string;
}

有了提供者后,我们就可以通过类构造函数把 CommodityService 引入到控制器中并进行使用,具体的代码如下:

@Controller("commodity")
export class CommodityController {
  constructor(private commodityService: CommodityService) {}

  @Post("/save")
  saveCommodity(@Body() commodity: Commodity) {
    this.commodityService.create(commodity);
  }

  @Get("/all")
  getCommoditys() {
    return this.commodityService.findAll();
  }

  @Get("/:id")
  getCommodityById(@Param() params: { id: string }) {
    return this.commodityService.findById(params.id);
  }
}

依赖注入

在 NestJs 中,借助 TypeScript 的功能,管理依赖项变得非常容易,因为他们仅仅通过类型来解析。

在上述的例子中,我们使用了@Injectable()装饰器来注入对应的提供者,而要使用的时候我们主要在对应的构造函数中声明就可以得到对应提供者的实例。例如:

constructor(private commodityService: CommodityService) {}

注意:在 NestJs 中提供者和控制都需要在 Module 中声明才能使用,要不然会报错。

范围

提供者通常具有与应用程序生命周期同步的生命周期(“范围”)。当应用程序启动时,必须解决每个依赖项,因此必须实例化每个提供程序。同样,当应用程序关闭时,每个提供程序都将被销毁。但是,也有一些方法可以使您的提供程序生命周期限定在请求范围内,后续我们会详细说明。

定制提供者

Nest 有一个内置的控制反转(“IoC”)容器,可以解析提供者之间的关系。此功能是上述依赖项注入功能的基础,但实际上比我们迄今为止所描述的功能要强大得多。有多种方法可以定义提供程序:您可以使用普通值、类以及异步或同步工厂,在后续的笔记中会有记录。

可选提供者

有时,您可能存在不一定需要解决的依赖关系。例如,您的类可能依赖于配置对象,但如果没有传递任何内容,则应使用默认值。在这种情况下,依赖关系变得可选,因为缺少配置提供程序不会导致错误。

要指示提供程序是可选的,请@Optional()在构造函数的签名中使用装饰器。

基于属性的注入

我们可以使用构造函数进行注入外我们还可以使用基于属性的注入方式来注入提供者。

当我们的顶级类依赖于一个或者多个提供者的时候,那么通过从构造函数调用子类来将它们一路向上传递可能会非常乏味。为了避免这种情况,您可以@Inject()在属性级别使用装饰器。例如:

import { Injectable, Inject } from "@nestjs/common";

@Injectable()
export class HttpService<T> {
  @Inject("HTTP_OPTIONS")
  private readonly httpClient: T;
}

注意:如果您的类不扩展另一个提供程序,您应该始终更喜欢使用基于构造函数的注入。

手动实例化

到目前为止,我们已经讨论了 Nest 如何自动处理解决依赖关系的大部分细节。在某些情况下,您可能需要跳出内置依赖注入系统并手动检索或实例化提供程序。下面我们引入两个这样的主题。

  • 要获取现有实例或动态实例化提供程序
  • 要在功能中获取提供程序 bootstrap()

这两个主题在后续会慢慢进行说明。

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

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

相关文章

【Winform学习笔记(四)】ComboBox获取电脑串口信息

ComboBox获取电脑串口信息 前言正文1、实现方法2、具体代码3、实现效果 前言 在本文中主要介绍 如何基于 Winform 框架实现 ComboBox 下拉框控件获取电脑串口信息。 正文 1、实现方法 在窗体添加一个 ComboBox 下拉框控件&#xff1b;通过 IO.Ports.SerialPort 获取串口信息…

【前端实习评审】对小说详情模块更新的后端接口压力流程进行了人群优化

大家好&#xff0c;本篇文章分享一下【校招VIP】免费商业项目“推推”第一期书籍详情模块 前端同学的开发文档周最佳作品。该同学来自安徽科技学院土木工程专业。本项目亮点难点&#xff1a; 1.热门书籍在更新点的访问压力&#xff1b; 2.书籍更新通知的及时性和有效性&#xf…

解决了项目中几个比较搞心态的bug

1、keep-alive 正常keep-alive的使用便可以做项目的缓存&#xff0c;但是我们的项目很不正常 项目是属于动态缓存&#xff0c;动态缓存有一个弊端 举个栗子&#xff1a; a组件为设置了需要缓存的页面&#xff1b; b组件为设置了需要缓存的页面&#xff1b; c组件为设置了不需…

讲解 @ServletComponentScan注解

目录: 1、用法介绍2、实例讲解 1、介绍 在SpringBoot项目启动器中添加ServletComponentScan注解后&#xff0c;SpringBoot在启动时会扫描并注册所有带有WebServlet&#xff08;控制器&#xff09;、WebFilter&#xff08;过滤器&#xff09;、WebListener&#xff08;监听器&a…

自定义字体服务 - 基于Node的Web字体解决方案

自定义字体服务 - 基于Node的Web字体解决方案 背景技术选型font-face介绍实现方案&#xff08;介绍字体设计、转换、兼容性处理等技术实现细节。&#xff09;接口实现方式&#xff08;实现中遇到的问题和解决方案&#xff09;总结开源地址参考 背景 在前端开发中&#xff0c…

MySQL中LEFT JOIN的用法

原理 LEFT JOIN 关键字返回左表&#xff08;table1&#xff09;中的所有记录&#xff0c;以及右表&#xff08;table2&#xff09;中的匹配记录&#xff08;如果有&#xff09; 注意&#xff1a; LEFT JOIN 关键字返回左表&#xff08;Customers&#xff09;中的所有记录&…

家具小程序搭建攻略

要想快速搭建一个家具小程序商城&#xff0c;乔拓云平台是一个非常方便的选择。下面就来详细介绍一下制作的具体步骤。 首先&#xff0c;登录乔拓云平台&#xff0c;进入后台管理页面。在页面上找到【商城】选项&#xff0c;点击【去管理】进入后台管理页面。 在后台管理页面中…

【算法与数据结构】222、LeetCode完全二叉树的节点个数

文章目录 一、题目二、一般遍历解法三、利用完全二叉树性质四、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、一般遍历解法 思路分析&#xff1a;利用层序遍历&#xff0c;然后用num记录节点数量。其他的例如…

lama cleaner

这里写自定义目录标题 安装参数包含的额外plugins 安装 conda create --name lamacleaner python3.10 pip install -r requirements.txt pip install gfpgan pip install realesrgan pip install rembg pip install .如果安装本package报错&#xff0c;可以尝试改&#xff1…

【2023】Nacos下载与安装配置(2.2.3版本示例)

1、Nacos概述 1.1 什么是Nacos Nacos 是阿里巴巴推出来的一个新开源项目&#xff0c;这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服…

AndroidStudio Memory profiler(内存分析器)

1.Record Java/Kotlin allocations 查看java 层中对象的调用栈和短时间内创建对象的次数。可用于内存抖动快速分析,可用快速查找到该对象的调用栈(等同于mat) 从上图可见&#xff0c;短时间内创建了23个char[] 数组&#xff0c;其中最大的char[] 占用20k, 查看cll stack 调用…

前端将css.html.js打包到一起打开

过程我是按照下面的执行的&#xff0c;大家可以直接参考这个博客里的过程&#xff0c;下面我记录一下遇到的一些问题&#xff0c;我的电脑是mac 打包教程 1.执行命令npm install electron 在安装Electron时报错command sh -c node install.js 在指令后面添加 --ignore-scripts…

火山引擎DataLeap如何解决SLA治理难题(二):申报签署流程与复盘详解

申报签署流程详解 火山引擎DataLeap SLA保障的前提是先达成SLA协议。在SLA保障平台中&#xff0c;以 申报单签署的形式达成SLA协议。平台核心特点是 优化了SLA达成的流程&#xff0c;先通过 “系统卡点计算”减少待签署任务的数量&#xff0c;再通过 “SLA推荐计算”自动签署部…

No module named ‘_bz2‘

【问题】 mmlab使用custom_imports加载失败&#xff0c;调试到里面去发现import时引发error&#xff1a; ModuleNotFoundError: No module named ‘_bz2’ 【解决】 参考https://stackoverflow.com/questions/50335503/no-module-named-bz2-in-python3靠后的回答。 下载文件…

Vue学习Day2——指令补充

一、指令修饰符 1、什么是指令修饰符&#xff1f; ​ 所谓指令修饰符就是通过“.”指明一些指令后缀 不同的后缀封装了不同的处理操作 —> 简化代码 2、按键修饰符 keyup.enter —>当点击enter键的时候才触发 代码演示&#xff1a; <!DOCTYPE html> <html…

大模型开发(十三):Function calling调用外部工具API,实现实时天气查询

全文共1.2w余字&#xff0c;预计阅读时间约34~50分钟 | 满满干货(附代码案例)&#xff0c;建议收藏&#xff01; 本文目标&#xff1a;完整构建一个借助Function calling功能调用外部工具API的开发流程&#xff0c;实现天气信息的实时查询 本文代码切换使用gpt3.5和gpt4接口&a…

【雕爷学编程】Arduino动手做(88)---水流量传感器模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

低代码开发为什么能长盛不衰?

低代码是一种通过可视化的界面与配置为开发者提供一个快速创建应用软件的开发环境的技术。2018年&#xff0c;西门子收购低代码企业Mendix、美国低代码独角兽企业Outsystems获得1.5亿美元的融资&#xff0c;这两个事件的发生将低代码市场带入资本方的视野&#xff0c;中国低代码…

背包问题(1)------动态规划

你有一个背包&#xff0c;地上一堆物品&#xff0c;挑选一些物品放入背包中&#xff0c;最大能够挑选出来的价值是多少 背包可以装满&#xff0c;背包也是可以不必都装满 一)01背包问题 【模板】01背包_牛客题霸_牛客网 (nowcoder.com) 1)求这个背包最多可以装多大价值的物品&a…

Java编程实现遍历两个MAC地址之间所有MAC的方法

Java编程实现遍历两个MAC地址之间所有MAC的方法 本文实例讲述了java编程实现遍历两个MAC地址之间所有MAC的方法。分享给大家供大http://家参考&#xff0c;具体如下&#xff1a; 在对发放的设备进行后台管理时,很多时候会用到设备MAC这个字段,它可以标识唯一一个设备。然而在数…