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!

Povezani članci