typescript - servicio - Angular2: Inyectar una clase no @Injectable
servicios angular 6 (3)
angular: 2.0.0-beta.9
¿Es posible inyectar una clase no @Injectable
en un component
? Por ejemplo, esta clase podría provenir de una biblioteca de terceros.
Si es posible. De hecho, el decorador @Injectable
no especifica que una clase sea inyectable en otras, sino que desea inyectar algo en ella a nivel de su constructor.
Si no desea inyectar algo en su clase, no es obligatorio agregar el decorador @Injectable
. Esta clase puede inyectarse en otras.
Creo que este problema de Github podría ayudarte:
Lo importante aquí es comprender la diferencia entre decoradores y anotaciones. Aquí hay un gran artículo sobre este tema:
Creo que sí, es posible. Lo probé sin el decorador @Injectable
y funciona bien.
AuthService.ts
import {Injectable} from ''angular2/core'';
import {Http, Response,HTTP_PROVIDERS} from ''angular2/http'';
import ''rxjs/Rx'';
import {Observable} from ''rxjs/Observable'';
export interface sharedObject{
firstName:string;
lastName:stirng;
}
export class AuthService{
user:sharedObject;
constructor()
{
console.log(''AuthService started'')
this.user={firstName:"micronyks",lastName:"shah"};
}
change() {
console.log(''change to angular2'');
this.user.firstName="micronyks1";
this.user.lastName="shah1";
}
}
Si te preguntas, porque algunas clases, usan DI en el constructor y no usan @Injectable()
. Porque esta decorado @, por ejemplo @Components
.
El componente Heroes también tiene una dependencia inyectada. ¿Por qué no agregamos @Injectable () al HeroesComponent?
Podemos agregarlo si realmente queremos. No es necesario porque HeroesComponent ya está decorado con @Component. TypeScript genera metadatos para cualquier clase con un decorador, y cualquier decorador lo hará.
Para más información, puede leer este enlace Página angular
Si la clase tiene dependencias, aún puede usarla en DI. Solo proporcione una fábrica para ello
Si desea poder inyectar una clase que tiene dependencias (argumentos de constructor) pero no quiere o no puede aplicar @Injectable()
, puede usar una fábrica en su lugar
bootstrap(AppComponent, [
SomeDep,
provide(SomeType, {useFactory: (dep) => new SomeType(dep),
deps: [SomeDep]})
]);
Puede crear variables para dichos proveedores para que sean fácilmente reutilizables sin esta engorrosa declaración (como por ejemplo HTTP_PROVIDERS
)
export const SOME_TYPE_PROVIDERS: any[] = [
SomeDep,
provide(SomeType, {useFactory: (dep) => new SomeType(dep),
deps: [SomeDep]})
];
y luego usarlo como
bootstrap(AppComponent, [SOME_TYPE_PROVIDERS]);