Ответ 1
Вы можете использовать Injector
import { Injector } from '@angular/core'
...
constructor(private injector: Injector){
if(true) {
this.oneService = <OneService>this.injector.get(OneService);
} else {
this.twoService = <TwoService>this.injector.get(TwoService);
}
}
Как упоминал @MeirionHughes, это называется шаблоном локатора службы:
Этот метод является примером шаблона локатора службы.
Избегайте этой техники, если она вам не нужна. Он поощряет небрежный подход к захвату, как вы видите здесь. Трудно объяснить, понять и проверить. Вы не можете знать, проверяя конструктор, что этот класс требует или что он будет делать. Он мог бы получать услуги от любого компонента-предка, а не только от своего собственного. Вы вынуждены освободить реализацию, чтобы узнать, что она делает.
Разработчики Framework могут использовать этот подход, когда они должны получать услуги в общем и динамическом режиме.
Источник: https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#explicit-injector
И снова, как уже упоминалось, вы можете получить эти инжекторы в другой службе, а затем вставить эту услугу в свой компонент.