angular - 如何在父类中注入服务而不将其传递给构造函数?角 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
将使用HttpClient
and UserService
。
UserService
将使用更多的服务。
那么我怎样才能获得一个看起来像这样的类实例化,const doggo = new Dog();
它将创建/使用/注入 AnimalService 而不会在所有类中传递它?
解决方案
我终于找到了如何做到这一点。
按照我的例子:
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());
它适用于我的情况,希望它也能帮助你!
推荐阅读
- ios - 使用 IIS 重写替换 URL 中的 %5E
- javascript - 如何在reactjs中以fullcalendar传递数据并在handleDateClick中检索
- javascript - 检查密码匹配,意外操作。怎么了?
- c++ - Trie 实现的简洁数据结构
- python - 如何在 for 循环中使用 subprocess.Popen?
- r - 在两点之间拆分字符串列表
- sql-server - SQL Server 内部/默认资源池随时间增加
- java - HP ALM 文件附件
- sql - SQL:计算列 = 值且另一列与第一个条件为真的组中的值相同的行?
- macos - popUpMenuPositioningItem:atLocation:inView 降低了弹出菜单的高度