typescript - Hur injicerar man en tjänst i föräldraklassen utan att passera den i konstruktören? Angular 6


Jag skulle vilja veta hur man injicerar en tjänst med flera beroenden i en abstrakt klass som kommer att utökas av flera klasser.

På ett mer effektivt sätt än att skicka det i alla konstruktörer!

Jag försöker skapa statisk, men om tjänsten aldrig instansieras av någon annan kommer singleton-instansvariabeln aldrig att tilldelas

Något som detta: (Är bara ett exempel)

@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());

I det här fallet kommer AnimalService att använda HttpClient och UserService.

UserService kommer att använda många fler tjänster.

Så hur kan jag få en klassinstansiering som ser ut så här const doggo=new Dog(); som kommer att skapa/använda/injicera AnimalService utan att skicka in det i alla klasser?

Svar #1

Jag hittar äntligen hur man gör detta.

Följande mitt exempel:

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());

Det fungerar i mitt fall, hoppas det kommer att hjälpa dig också!

Relaterade artiklar