Nest.js:如何覆盖导入模块中的提供程序?

Posted

技术标签:

【中文标题】Nest.js:如何覆盖导入模块中的提供程序?【英文标题】:Nest.js: how to override providers in an imported module? 【发布时间】:2020-03-04 02:23:07 【问题描述】:

代码示例

第三方库
@Module(
    providers: [AService]
    exports: [AService]
)
export class AModule 


@Module(
    imports: [AModule],
    providers: [BService]
    exports: [BService]
)
export class BModule 

我的代码
@Module(
    imports: [BModule],
    providers: [CService]
)
export class CModule 

问题

如何从我的代码中覆盖/替换 AService 提供程序? (没有第三方库补丁)

【问题讨论】:

首先,您为什么要这样做?我建议使您的模块动态化并接受您可以使用的特定实例的提供者 【参考方案1】:

根据我的评论,这就是您如何使用动态提供程序制作动态模块


export interface ProviderInterface 
  handle(): void;


@Injectable()
class SomeHandlingProvider 
  constructor(@Inject('MY_DYNAMIC_PROVIDER') private readonly dynamicProvider: ProviderInterface) 
  handle(): void 
    this.dynamicProvider.handle();
  


@Module()
export class AModule 
  public static forRoot(provider: ProviderInstance): DynamicModule 
    return 
       module: AModule,
       providers: [
         
           provide: 'MY_DYNAMIC_PROVIDER',
           useClass: provider,
         ,
         SomeHandlingProvider,
      ],
    ;
  

那你就可以这样使用了


class GenericDynamicProviderExample implements ProviderInterface 
  handle(): void 
    console.log('hello');
  


@Module(
  imports: [
    AModule.forRoot(GenericDynamicProviderExample),
  ],
)
export class BModule 

【讨论】:

以上是关于Nest.js:如何覆盖导入模块中的提供程序?的主要内容,如果未能解决你的问题,请参考以下文章

Nest.js 中的优雅环境处理

在 nest.js 中处理第三方依赖项

在 NestJS Jest 测试中覆盖提供程序

导入的 python 模块覆盖选项解析器

如何在 Nest.js 中提供静态 HTML 文件?

前端工程师梭哈初体验(基于Nest.js写服务端代码)