在 NestJS 中,当你使用依赖注入(DI)系统,并且 inject
是一个字符串数组时,每个字符串代表一个 DI 令牌。这些令牌用于从 NestJS 的容器中检索相应的服务或值。在 useFactory
函数中,你可以通过参数接收这些被注入的服务或值。这些参数的顺序与 inject
数组中的令牌顺序相对应。
让我们通过一个具体的例子来展示这个过程:
首先,定义一些服务和对应的令牌:
import { Injectable, Inject, Module, DynamicModule } from '@nestjs/common';
@Injectable()
class ConfigService {
getDatabaseConfig() {
return {
host: 'localhost',
port: 5432,
// 更多数据库配置...
};
}
}
const DATABASE_CONFIG_TOKEN = 'DATABASE_CONFIG_TOKEN';
在这个例子中,ConfigService
是一个典型的服务,提供数据库配置。DATABASE_CONFIG_TOKEN
是一个字符串令牌,用于在 DI 系统中代表某个值或服务。
现在,创建一个模块并使用 useFactory
来动态提供一个服务,同时使用 inject
来注入依赖:
@Module({})
export class AppModule {
static forRootAsync(): DynamicModule {
return {
module: AppModule,
providers: [
ConfigService,
{
provide: DATABASE_CONFIG_TOKEN,
useFactory: (configService: ConfigService) => {
return configService.getDatabaseConfig();
},
inject: [ConfigService],
},
{
provide: 'DatabaseConnection',
useFactory: (dbConfig) => {
// 在这里创建数据库连接
console.log('Database Config:', dbConfig);
},
inject: [DATABASE_CONFIG_TOKEN],
}
],
exports: ['DatabaseConnection'],
};
}
}
在这个模块中:
ConfigService
被提供并且可以被注入。useFactory
函数创建了数据库配置,并且它依赖于 ConfigService
。这个依赖通过 inject
数组注入。生成的配置对象将与 DATABASE_CONFIG_TOKEN
令牌关联。useFactory
函数用于创建数据库连接。它注入了与 DATABASE_CONFIG_TOKEN
相关联的数据库配置。由于 inject
指定了 DATABASE_CONFIG_TOKEN
,因此 NestJS DI 系统会将第一个 useFactory
生成的配置对象传递给这个函数。通过这种方式,你可以在 NestJS 的 useFactory
函数中注入由字符串令牌标识的对象或值。inject
数组中的每个令牌对应 useFactory
函数参数中的一个值,这些值按照 inject
中的顺序被注入。这个机制允许在 NestJS 应用中进行灵活且强大的依赖注入和服务配置。