Tengo 2 servicios one.service.ts y two.service.ts , y un componente dashboard.component.ts .
¿Cómo inyectar condicionalmente esos servicios en el componente?
import { Component, ViewEncapsulation, Inject } from '@angular/core'; import { OneService } from '../services/one.service'; import { TwoService } from '../services/two.service'; @Component({ selector: 'dashboard', encapsulation: ViewEncapsulation.Emulated, styleUrls: ['./dashboard.less'], templateUrl: './dashboard.html' }) export class DashboardComponent { constructor() { // Here how do I get service instance based on some this condition. if(true) { /* Service **one.service.ts** to be injected */ } else { /* Service **two.service.ts** to be injected */ } } }Puedes usar el 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); } }Como mencionó @MeirionHughes, esto se llama el patrón del localizador de servicios:
La técnica es un ejemplo del patrón del localizador de servicios.
Evita esta técnica a menos que realmente la necesites. Fomenta un enfoque descuidado de bolsa de sorpresas como el que se ve aquí. Es difícil de explicar, entender y probar. Al inspeccionar el constructor, no puede saber qué requiere esta clase o qué hará. Podría adquirir servicios de cualquier componente anterior, no solo del suyo propio. Estás obligado a explorar la implementación para descubrir lo que hace.
Los desarrolladores de marcos pueden adoptar este enfoque cuando deben adquirir servicios de forma genérica y dinámica.
Fuente: https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#explicit-injector
Y nuevamente, como se mencionó, puede obtener estos inyectores en otro servicio y luego inyectar este servicio en su componente.
En otras palabras, desea lograr un patrón Bridge o Abstract Factory . En este caso, puede usar useFactory . Publicación relacionada.