Nest.js: как переопределить провайдеров в импортированном модуле? - PullRequest
0 голосов
/ 07 ноября 2019

Пример кода

Сторонняя библиотека
@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 Ответ

0 голосов
/ 10 ноября 2019

Исходя из моего комментария, вот как вы будете делать динамический модуль с динамическим провайдером


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 {}
...