serviceFactory как зависимость (deps: []) в объекте провайдера - возможно ли это? - PullRequest
0 голосов
/ 19 сентября 2019

Я получил провайдера в app.module, который определен следующим образом:

{
                    multi: true,
                    deps: [ServiceA, ServiceB],
                    provide: HTTP_INTERCEPTORS,
                    useClass: HttpResponseInterceptor,
}

И он работает нормально.Проблема в том, что мне нужно, чтобы ServiceB конфигурировался с помощью заводской функции, а также serviceB необязательно , но что-то вроде этого не работает :

// Factory function
serviceBFactory = (param) => { // returns instance of my service or null, depends on param }

...
deps: [ ServiceA, { provide: ServiceB, useFactory: serviceBFactory } ]
...

Ошибка, которую я получаю:

Error: StaticInjectorError(AppModule)[InjectionToken HTTP_INTERCEPTORS -> [object Object]]: 
  StaticInjectorError(Platform: core)[InjectionToken HTTP_INTERCEPTORS -> [object Object]]
NullInjectorError: No provider for [object Object]!

Есть ли какой-то особый синтаксис для него или это невозможно по замыслу?

1 Ответ

0 голосов
/ 19 сентября 2019

Позвольте мне ответить на мой собственный вопрос ;-) Поэтому я решил собрать InjectionToken вручную:

export function serviceBFactory() {
    if (APP_CONFIG.serviceBNeeded) {
        return new ServiceB();
    } else {
        return null;
    }
}

const ServiceBToken: InjectionToken<ServiceB> = new InjectionToken<ServiceB>(
  'ServiceB instance or Null', 
  {
    providedIn: 'root',
    factory: serviceBFactory,
  }
);

А затем просто передать его в массив deps ...

deps: [ServiceBToken]

Я не знаю, нормально ли это, или, может быть, есть лучший способ добиться того, чего я хотел, но это решение работает по крайней мере.

...