Angular внедрение зависимостей модуля с заводским поставщиком - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть провайдер фабрики, который вызывает метод службы. Этот сервис раньше был просто конкретным классом с одной реализацией и выглядел так:

export const appInitialiserFactory = (
  environmentService: EnvironmentService
) => async () => {
  await environmentService.load().toPromise();
};

export const appInitialiser = {
  provide: APP_INITIALIZER,
  useFactory: appInitialiserFactory,
  deps: [
    EnvironmentService
  ],
  multi: true
};

Это работало нормально, пока мне не пришлось разделить EnvironmentService на 2 отдельные реализации, которые я назову Real и Mock (для тестирования). Это означает, что EnvironmentService, который ранее был классом, теперь превратился в интерфейс, который реализуют другие 2 класса. Для поддержки этого я создал модуль, который можно динамически загружать в зависимости от конфигурации приложения. Например, этот MockEnvironmentService выглядит следующим образом:

@NgModule({
  providers: [
    { provide: 'ENVIRONMENT_SERVICE', useClass: MockEnvironmentService }
  ]
})
export class MockEnvironmentServiceModule { }

и настроен в модуле приложения следующим образом:

imports: [
    ...
    environment.environmentModule,
    ...
],

Это отлично работает для других служб и компонентов, которые зависят от EnvironmentService тип, правильный сервис предоставляется на основе модулей. Но я не могу заставить это работать в фабричной функции. Я попытался внедрить в модуль в deps, но он не разрешает модуль (он просто дает модуль в качестве зависимости). Я также попытался удалить deps, чтобы увидеть, будет ли он автоматически разрешен, но это тоже не работает. Я не мог найти информацию о том, как это сделать. Можно ли это сделать с заводским провайдером? Если нет, то какая лучшая альтернатива для этого?

...