Как внедрить сервис в родительский класс, не передавая его в конструктор?Угловой 6 - PullRequest
0 голосов
/ 17 октября 2018

Я хотел бы знать, как внедрить службу с несколькими зависимостями в абстрактный класс, который будет расширен несколькими классами.

Более эффективным способом, чем передать его во все конструкторы!

Я пытаюсь создать статический, но если другой экземпляр никогда не создаст другой сервис, переменной экземпляра синглтона никогда не будет назначен

Примерно так: (это просто пример)

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

В этом случае AnimalService будет использовать HttpClient, а UserService.

UserService будет использовать гораздо больше услуг.

Так как же получить экземпляр класса, который выглядит так const doggo = new Dog();, который будет создавать / использовать / внедрять AnimalService, не передавая его во все классы?

1 Ответ

0 голосов
/ 28 января 2019

Я наконец-то нашел, как это сделать.

Следуя моему примеру:

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

Это работает в моем случае, надеюсь, оно вам тоже поможет!

...