【发布时间】:2018-10-17 15:33:59
【问题描述】:
我想知道如何在一个抽象类中注入一个具有多个依赖项的服务,该抽象类将被多个类扩展。
以一种更有效的方式,然后将其传递给所有构造函数!
我尝试创建静态的,但如果服务从未被另一个实例化,则永远不会分配单例实例变量
类似这样的:(只是一个例子)
@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 而不在所有类中传递它?
【问题讨论】:
-
我不确定有没有办法解决这个问题。我可能会创建一个服务,它本质上是一个用于实例化这些对象的工厂。然后服务可以传递所有依赖项。
-
您将如何有效地做到这一点?或者你有文档吗?链接?
-
我的意思是创建一个具有
createDog等方法的服务。该服务可以注入AnimalService等。然后它可以执行return new Dog(this.animalService)。你仍然会传递给构造函数,但我看不出有什么效率低下。在你的组件中避免像这样的new实际上可能是有益的——你可以在你的单元测试中模拟createDog。 -
你最后有没有找到实现这个的方法?
-
是的!我会回答我的问题。
标签: angular typescript dependency-injection