【问题标题】:Nest.js: how to override providers in an imported module?Nest.js:如何覆盖导入模块中的提供程序?
【发布时间】: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 提供程序? (没有第三方库补丁)

【问题讨论】:

  • 首先,您为什么要这样做?我建议使您的模块动态化并接受您可以使用的特定实例的提供者

标签: javascript node.js dependency-injection nestjs


【解决方案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 {}

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2020-05-15
    • 2012-09-11
    • 2020-09-23
    • 2021-07-15
    • 2018-03-10
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多