typescript - ¿Cómo inyectar un servicio en la clase padre sin pasarlo en el constructor? Angular 6
Me gustaría saber cómo inyectar un servicio con múltiples dependencias dentro de una clase abstracta que será extendida por múltiples clases.
¡De una manera más eficiente que pasarlo en todos los constructores!
Intento crear estático, pero si el servicio nunca es instanciado por otro, la variable de instancia singleton nunca será asignada
Algo así: (Es solo un ejemplo)
@Injectable({
providedIn: 'root'
})
export class AnimalService {
constructor(private http: HttpClient, private userService: UserService) {}
countTotalInDB(type): number {
return this.http.get(...);
}
getUserAnimals(userId: number) {
return this.userService.getUser(userId).animals;
}
}
abstract class Animal {
constructor() {}
public getTotalInDataBase(type): number {
// How to get a instance of AnimalService ?
return animalService.countTotalInDB(type);
}
}
export class Cat extends Animal {
constructor() {
super();
}
public getTotalInDataBase(): number {
return super.getTotalInDataBase('cat');
}
}
export class Dog extends Animal {
constructor() {
super();
}
public getTotalInDataBase(): number {
return super.getTotalInDataBase('dog');
}
}
const doggo = new Dog();
console.log(doggo.getTotalInDataBase());En este caso, AnimalService utilizará HttpClient y UserService.
UserService usará muchos más servicios.
Entonces, ¿cómo puedo obtener una instanciación de clase que se vea así const doggo=new Dog(); que creará/utilizará/inyectará el AnimalService sin pasarlo en todas las clases?
Respuesta #1
Finalmente encuentro cómo hacer esto.
Siguiendo mi ejemplo:
import { inject } from '@angular/core'; // Answer
@Injectable({
providedIn: 'root'
})
export class AnimalService {
constructor(private http: HttpClient, private userService: UserService) {}
countTotalInDB(type): number {
return this.http.get(...);
}
getUserAnimals(userId: number) {
return this.userService.getUser(userId).animals;
}
}
abstract class Animal {
protected animalService: AnimalService; // Answer
constructor() {
this.animalService = inject(AnimalService); // Answer
}
public getTotalInDataBase(type): number {
// How to get a instance of AnimalService ?
return this.animalService.countTotalInDB(type);
}
}
export class Cat extends Animal {
constructor() {
super();
}
public getTotalInDataBase(): number {
return super.getTotalInDataBase('cat');
}
}
export class Dog extends Animal {
constructor() {
super();
}
public getTotalInDataBase(): number {
return super.getTotalInDataBase('dog');
}
}
const doggo = new Dog();
console.log(doggo.getTotalInDataBase());
Funciona en mi caso, ¡espero que también te ayude a ti!
