如何用ConfigurableModuleBuilder为NestJS动态模块提供多提供者
如何用ConfigurableModuleBuilder拆分NestJS动态模块的多提供者
你可以通过ConfigurableModuleBuilder的setExtraProviders方法,将registerAsync传入的配置项拆分为独立的可注入提供者,无需依赖第三方库。具体步骤如下:
1. 定义自定义注入令牌
先创建两个唯一的令牌,用于后续注入时标识对应的服务:
// auth.constants.ts export const USER_SERVICE = Symbol('USER_SERVICE'); export const CONFIG_SERVICE = Symbol('CONFIG_SERVICE');
2. 完善模块选项类型
确保你的AuthModuleOptions接口包含要拆分的服务类型:
// auth.module.ts import { IUserService, IConfigService } from './interfaces'; export interface AuthModuleOptions { userService: IUserService; configService: IConfigService; }
3. 修改ConfigurableModuleBuilder配置
在构建模块时,通过setExtraProviders将配置选项中的服务转换为独立提供者:
// auth.module.ts import { ConfigurableModuleBuilder } from '@nestjs/common'; import { USER_SERVICE, CONFIG_SERVICE } from './auth.constants'; export const { ConfigurableModuleClass, MODULE_OPTIONS_TOKEN, OPTIONS_TYPE, ASYNC_OPTIONS_TYPE, } = new ConfigurableModuleBuilder<AuthModuleOptions>() .setExtraProviders((options) => [ { provide: USER_SERVICE, useValue: options.userService, }, { provide: CONFIG_SERVICE, useValue: options.configService, }, ]) .build();
setExtraProviders会接收模块的最终配置选项,自动为你创建对应的提供者并注册到模块中。
4. 在服务中注入使用
现在就可以直接通过自定义令牌注入对应的服务了:
// auth.service.ts import { Injectable, Inject } from '@nestjs/common'; import { USER_SERVICE, CONFIG_SERVICE } from './auth.constants'; import { IUserService, IConfigService } from './interfaces'; @Injectable() export class AuthService { constructor( @Inject(USER_SERVICE) private userService: IUserService, @Inject(CONFIG_SERVICE) private configService: IConfigService, ) {} // 编写你的业务逻辑,比如验证用户、读取配置等 }
原注册方式保持不变
你的registerAsync调用无需修改,依然可以正常传入依赖并返回配置对象:
AuthModule.registerAsync({ imports: [UserModule], inject: [UserService, ConfigService], useFactory: (userService: UserService, configService: ConfigService) => ({ userService: userService, configService, }), }),
这样就完成了将动态模块配置中的多服务拆分为独立提供者的需求,完全基于NestJS官方提供的ConfigurableModuleBuilder实现,替代了旧方案中的第三方库依赖。
内容的提问来源于stack exchange,提问作者user12898141
相关产品推荐
相关产品推荐

