typescript - Kako ubrizgati servis u roditeljsku klasu bez prosljeđivanja u konstruktor? Angular 6
Želio bih znati kako ubrizgati servis s višestrukim ovisnostima unutar apstraktne klase koju će proširiti više klasa.
Na učinkovitiji način nego da ga prosljeđujete u svim konstruktorima!
Pokušavam stvoriti statički, ali ako uslugu nikada ne instancira netko drugi, varijabla singleton instance nikada neće biti dodijeljena
Nešto poput ovoga: (Samo je primjer)
@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());U ovom slučaju, AnimalService će koristiti HttpClient i UserService.
UserService će koristiti mnogo više servisa.
Kako onda mogu dobiti instanciranje klase koja izgleda ovako const doggo=new Dog(); i koja će stvoriti/koristiti/injektirati AnimalService bez da ga prosljeđujem u sve klase?
Odgovor #1
Napokon sam pronašao kako to učiniti.
Slijedeći moj primjer:
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());
Radi u mom slučaju, nadam se da će pomoći i tebi!
