Решением является useFactory вместо UseClass, измените код, как показано в следующем примере: сначала создайте класс фабрики с решением по логике DI:
export function myFactory() {
if(myRule){
return new FirstRESTService();
}
return new SecondRESTService();
}
Затем измените код компонента на:
@Component({
selector: 'this-is-tag',
template: htmlStr,
providers: [{ provide: RESTToken, useFactory: myFactory}],
Иногда возникает ситуация, когда вы хотите добавить некоторые зависимости к фабрике, потому что она нужна вам, чтобы решить, следует ли возвращать serviceA или serviceB. Для этого мы можем использовать свойство deps следующим образом:
export function myFactory(obj:MyDependencyClass) {
if(obj.HasMyRule){
return new FirstRESTService();
}
return new SecondRESTService();
}
также в вашем компоненте:
@Component({
selector: 'this-is-tag',
template: htmlStr,
providers: [{ provide: RESTToken, useFactory: myFactory}],
deps: [MyDependencyClass]
, но не забудьте включить MyDependencyClass в app.module.ts.