一篇文章学会如何使用 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

相关文章

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一