如何在父类中注入服务而不将其传递到构造函数中?角6

The*_*224 3 dependency-injection typescript angular

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

以更有效的方式将其传递到所有构造函数中!

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

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

@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());
Run Code Online (Sandbox Code Playgroud)

在这种情况下,AnimalService将使用HttpClientUserService

UserService将使用更多的服务。

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

The*_*224 8

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

按照我的例子:

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

Run Code Online (Sandbox Code Playgroud)

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

  • 你好@The224,你的代码正是我想要的结构,但我收到错误“inject()必须从注入上下文调用”,并使用“@angular/core:^6.1.10”,你会使用什么版本进行开发? (4认同)