nestjs之TypeOrm异步配置实现原理

在 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 系统中代表某个值或服务。

创建模块并使用 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'],
    };
  }
}

在这个模块中:

  1. ConfigService 被提供并且可以被注入。
  2. 第一个 useFactory 函数创建了数据库配置,并且它依赖于 ConfigService。这个依赖通过 inject 数组注入。生成的配置对象将与 DATABASE_CONFIG_TOKEN 令牌关联。
  3. 第二个 useFactory 函数用于创建数据库连接。它注入了与 DATABASE_CONFIG_TOKEN 相关联的数据库配置。由于 inject 指定了 DATABASE_CONFIG_TOKEN,因此 NestJS DI 系统会将第一个 useFactory 生成的配置对象传递给这个函数。

总结

通过这种方式,你可以在 NestJS 的 useFactory 函数中注入由字符串令牌标识的对象或值。inject 数组中的每个令牌对应 useFactory 函数参数中的一个值,这些值按照 inject 中的顺序被注入。这个机制允许在 NestJS 应用中进行灵活且强大的依赖注入和服务配置。

你可能感兴趣的:(nestjs原理,javascript,前端)