0

我在 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]!

是否有任何特殊语法或设计不可能?

4

1 回答 1

0

让我回答我自己的问题 ;-) 所以我决定手动构建 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]

我不知道它是否可以,或者是否有更好的方法来实现我想要的,但这个解决方案至少有效。

于 2019-09-19T12:30:09.243 回答