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

代码示例

第三方图书馆
@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提供程序? (无需第三方库修补程序)

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

在我的评论之后,这就是使用动态提供程序制作动态模块的方法


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 {}
本文链接:https://www.f2er.com/3144472.html

大家都在问