在NestJS中可以以多种方式自定义Providers。以下是一些常见的方法:
值提供者用于提供一些硬编码的值,例如配置对象或常量。这类提供者通过 useValue
关键字来指定要注入的值。
使用过程:
provide
属性来指定令牌(通常是一个字符串或符号)。useValue
属性来提供一个硬编码的值。示例:
import { Module } from '@nestjs/common';
@Module({
providers: [
{
provide: 'API_KEY',
useValue: '12345-ABCDE',
},
],
})
export class AppModule {}
类提供者用于将类实例作为依赖注入。这是最常见的提供者类型,通常用于服务类。
使用过程:
providers
数组中使用该类。provide
关键字指定一个令牌,并使用 useClass
来指定类。示例:
import { Module } from '@nestjs/common';
class MyService {
// 服务逻辑
}
@Module({
providers: [
{
provide: 'MyService',
useClass: MyService,
},
],
})
export class AppModule {}
工厂提供者通过工厂函数来创建提供者实例。这种方式适用于需要动态创建依赖项的场景。
使用过程:
providers
数组中使用这个工厂函数。provide
关键字指定一个令牌,并使用 useFactory
来指定工厂函数。示例:
import { Module } from '@nestjs/common';
@Module({
providers: [
{
provide: 'ASYNC_CONNECTION',
useFactory: async () => {
const connection = await createConnection();
return connection;
},
},
],
})
export class AppModule {}
异步提供者是工厂提供者的一个变种,允许在提供者实例化之前执行一些异步操作。
使用过程:
providers
数组中使用这个异步函数。provide
关键字指定一个令牌,并使用 useFactory
来指定异步工厂函数。示例:
import { Module } from '@nestjs/common';
@Module({
providers: [
{
provide: 'ASYNC_CONNECTION',
useFactory: async () => {
const connection = await createConnection();
return connection;
},
},
],
})
export class AppModule {}
别名提供者用于为已存在的提供者创建一个别名。
使用过程:
useExisting
指向现有的服务或提供者。示例:
import { Module } from '@nestjs/common';
class ActualService {
// 实际服务的逻辑
}
@Module({
providers: [
ActualService,
{
provide: 'AliasService',
useExisting: ActualService,
},
],
})
export class AppModule {}
多提供者用于在一个令牌下注册多个提供者,通常用于创建插件系统或聚合相同类型的服务。
使用过程:
providers
数组中定义多个提供者。multi
属性设置为 true
。
示例:
import { Module } from '@nestjs/common';
class MyService {
// 服务逻辑
}
class AnotherService {
// 另一个服务的逻辑
}
@Module({
providers: [
{
provide: 'MY_SERVICE',
useClass: MyService,
multi: true
},
{
provide: 'MY_SERVICE',
useClass: AnotherService,
multi: true
},
],
})
export class AppModule {}
以上是 NestJS 中六种自定义提供者的具体使用过程。这些提供者可以灵活地应用于各种场景,满足不同的开发需求。