【发布时间】:2020-03-16 11:52:00
【问题描述】:
通常,当您有一些可注入的服务要使用时,您会编写如下内容:
export class MyClass {
constructor(
private _myservice: MyService)
{ }
[...]
}
不幸的是,当你扩展 MyClass 时,子构造函数在调用 super 时需要注入相同的服务。
export class MyClassSon extends MyClass {
constructor()
{
super(); <<<---- ERROR!!!!
}
我很困惑。我使用 SuperClass 来允许子类访问可注入服务,而无需自己注入它们。
我找到的最佳解决方案是 Injector:
export class MyClass {
constructor(
injector: Injector)
{
this._myservice = injector.get(MyService);
this._fooservice = injector.get(FooService);
//others services...
}
}
export class MyClassSon extends MyClass {
constructor(injector: Injector)
{
super(injector);
//I can use any other services
}
这将超级调用的复杂性降到最低,但我仍然很生气,我需要做这个技巧。
是否有另一种方法可以在不使用 costructor 的情况下在类中注入一些东西,这样我就可以让它尽可能干净,并且只用于特定组件的初始化?
【问题讨论】:
-
您是否需要
MyClassSon中不需要的MyClass中的服务? -
通过构造函数注入是当服务没有超类时你总是做的事情。当服务具有超类时,为什么会有所不同?只需做简单、简单、自然、琐碎、可测试的事情:通过构造函数注入,并使用所需的参数调用 super()。或者使用委托而不是继承。
-
@Nicolas MyClass 是一个入口点,因此扩展它的每个组件都可以访问所有服务。如果一个子类需要一个特定的服务,它只会为自己注入它。我想我不明白你的问题。
-
这能回答你的问题吗? Inheritance and dependency injection
-
永远不要对组件使用继承
标签: angular typescript