一篇文章学会如何使用 NestJS 的五种 Provider 提供者

2024-01-03 04:20

本文主要是介绍一篇文章学会如何使用 NestJS 的五种 Provider 提供者,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

在构建复杂的后端应用中,如何有效地管理和彼此协作的各个部分,以及如何共享和复用功能已成为开发者们重要关注的问题。覆盖这些需求的一种技术就是 NestJS 中的 Providers。这次,让我们一起深入探讨这个关键概念,解密 Providers 的奥秘,了解它们是如何提供和分配服务的。

什么是 Provider

Provider 是 NestJS 中的一种核心构建块,它提供了封装与分享服务逻辑的方式。实际上,你可以将 Provider 看作是一种可以注入到任何地方的对象或实体。这些对象可以是类、工厂、值甚至更复杂的结构。不管它返回什么,它的核心意图是提供一种实现不同任务的方式,例如数据访问、辅助函数,所有这些都尽可能地可复用和可测试。

Providers 的主要类型

在 NestJS 中有五种主要的 Provider:

  • 值提供者
  • 类提供者
  • 工厂提供者
  • 异步工厂提供者
  • 别名提供者

以下内容,我们将详细深入探讨这五种类型的 Provider,并给出使用案例。

一、值提供者 Provider

值提供者是最直接的一种类型,它直接返回一个常量或者预定义的值。且更常见的用例是,将应用的配置注入到需要读取配置的服务中。

将配置对象作为值 Provider 的例子:

// 在模块定义中我们创建一个值 Provider
@Module({providers: [{provide: 'DATABASE_CONFIG',useValue: {host: 'localhost',port: 5432,user: 'dbuser',password: 'dbpassword',database: 'myDatabase'}}]
})// 在服务中,我们可以将这个值注入进来:
@Injectable()
export class DatabaseService {constructor(@Inject('DATABASE_CONFIG') private dbConfig: any) {}getConnectionDetails() {// 输出数据库配置信息console.log(this.dbConfig);}
}

二、类提供者 Provider

类提供者是 Provider 中常用的一种,它可以让我们通过依赖注入的方式来获取类的实例。这对复用和测试非常有价值,因为我们可以在测试时使用模拟的实例来替换真正的服务。

下面讲述了如何使用和注入类提供者的例子:

// 我们首先在模块定义中声明一个类提供者
@Module({providers: [ConfigService],
})// 接着在服务中,我们可以注入这个提供者
@Injectable()
export class UserService {constructor(private configService: ConfigService) {}getEnvironment() {// 输出当前应用环境console.log(this.configService.get('ENV'))}
}

三、工厂提供者 Provider

工厂提供者是最灵活的 Provider 形式。工厂函数可以返回任意值,并且可以用来执行复杂的同步或异步操作。同样的,这让我们可以根据运行时逻辑返回不同的结果或者根据不同的运行环境提供不同的实现。

下面是工厂提供者的一个例子:

// 在模块定义中,我们创建一个工厂提供者
@Module({providers: [{provide: 'ENV_CONFIG',useFactory: () => {// 例如,我们可以在此基于一些环境变量返回不同的配置:return process.env.NODE_ENV === 'development'? developmentConfig: productionConfig;},},],
})// 届时我们可以在服务中注入这个工厂提供者
@Injectable()
export class UserService {constructor(@Inject('ENV_CONFIG') private envConfig: any) {}getConfig() {// 输出当前的环境配置console.log(this.envConfig);}
}

四、异步工厂提供者 Provider

异步工厂提供者与工厂提供者在原则上是相似的,但它们返回一个 Promise 或 Observable。当 Promise 解析或者 Observable 发射出结果时,这个结果就会在应用中作为注入的值。这项特性对于需要进行异步操作来提供值的需求场景非常有用,比如数据库连接,远程配置等。

以下是异步工厂提供者的一个应用场景:

//在模块定义中我们先定义一个异步工厂提供者
@Module({providers: [{provide: 'DATABASE_CONNECTION',useFactory: async () => {const options = await getDbOptions();return createConnection(options);},},],
})// 在服务中,我们可以注入这个数据库连接
@Injectable()
export class UserService {constructor(@Inject('DATABASE_CONNECTION') private dbConnection: Connection) {}findUser(id: number) {return this.dbConnection.getRepository(User).findOne(id);}
}

在这个示例中,DATABASE_CONNECTION 是一个异步工厂提供者,这个提供者会异步地创建数据库连接。

五、别名提供者 Provider

别名提供者允许我们为提供者赋予别名,这样我们可以在不同上下文中引用并使用同样的值。这在某些需要多次引用同一个提供者或者希望使用更具语义化名称的场景中很有用。

下面是一个别名提供者的使用示例:

// 在模块定义中,我们创建 ConfigService 的别名
@Module({providers: [ConfigService,{provide: 'AppConfig',useExisting: ConfigService,},],
})// 在服务中,我们可以使用别名来注入这个提供者
@Injectable()
export class UserService {constructor(@Inject('AppConfig') private configService: ConfigService) {}getEnvironment() {// 输出当前应用环境console.log(this.configService.get('ENV'));}
}

在这个示例中,AppConfigConfigService 的别名,所以当我们请求 AppConfig 的时候,我们实际上获取到的是 ConfigService 的实例。

总结

本文介绍了 NestJS 中绝大多数的 provider 类型及其使用方式。希望这篇文章能帮助你理解不同的 provider 及其适用的场景。但我们这次的探索只是冰山一角,NestJS 还有很多高级特性等待你去挖掘。

这篇关于一篇文章学会如何使用 NestJS 的五种 Provider 提供者的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/564547

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti