services providers providedin injector injectiontoken injection injectable dependency dependency-injection typescript angular

dependency-injection - providers - injector angular 4



Constructor Angular 2 DI con parĂ¡metros opcionales (2)

Mi constructor tiene parámetros opcionales y parecen interferir con la forma predominante de hacer DI.

constructor(public name:string, public age?:number, private _service:Service);

Es comprensible que a Typescript no le guste que coloque un parámetro no opcional detrás de uno opcional, además el servicio no se inyecta cuando el parámetro opcional no está establecido. ¿Cómo lo soluciono? No puedo ponerlo en otro lugar en el constructor ya que se esperaría que configurara el servicio manualmente.

¿Hay algo así como la inyección de campo?

@Inject() private _service:Service; constructor(public name:string, public age?:number);

¿Debo reemplazar los parámetros opcionales por valores predeterminados? ¿Cualquier otra sugerencia?

Gracias

Editar Como se describe a continuación, traté de inyectar un servicio en un objeto que no es creado por DI de Angular. Esto no funciona Como no puedo crear esta clase (modelo) utilizando DI, ahora paso el servicio manualmente desde la clase que crea la instancia de estos objetos.


Si entiendo correctamente lo que intenta hacer, necesita una fábrica de servicios. Vea aquí: https://angular.io/docs/ts/latest/guide/dependency-injection.html#factory-provider

Básicamente,

class MyClass { constructor(public name:string, private _service:Service, public age?:number){} }

Y entonces

let myFactory = (_service: Service) => { return isAgeOk ? new MyClass(name, _service, age) : new MyClass(name, _service); };

Y luego debe proporcionar su servicio de esta manera:

providers: [{ provide: MyClass, useFactory: MyFactory, deps: [Service]}]


Simplemente agregue el decorador @Optional() antes del parámetro del constructor que solo debería inyectarse si había un proveedor registrado.

constructor(public name:string, @Optional() public age:number)