首页 > 解决方案 > 如何在父类中注入服务而不将其传递给构造函数?角 6

问题描述

我想知道如何在将由多个类扩展的抽象类中注入具有多个依赖项的服务。

以一种更有效的方式,然后将其传递给所有构造函数!

我尝试创建静态的,但如果服务从未被另一个实例化,则永远不会分配单例实例变量

像这样的东西:(只是一个例子)

@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将使用HttpClientand UserService

UserService将使用更多的服务。

那么我怎样才能获得一个看起来像这样的类实例化,const doggo = new Dog();它将创建/使用/注入 AnimalService 而不会在所有类中传递它?

标签: angulartypescriptdependency-injection

解决方案


我终于找到了如何做到这一点。

按照我的例子:

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

它适用于我的情况,希望它也能帮助你!


推荐阅读