通常,当您有一些想要使用的可注入服务时,您可以编写如下代码:
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的情况下在类中注入一些东西,这样我就可以尽可能地让它保持干净,并且只对特定的组件进行初始化?
发布于 2019-11-21 02:02:51
如果你绝对想保持构造函数整洁,你可以使用CoreModule静态字段中的注入器(例如)。不推荐这样做,但它是有效的。
首先,您应该从CoreModule/AppModule (root)检索Injector
export class CoreModule {
public static injector: Injector;
public constructor(injector: Injector) {
CoreModule.injector = injector;
}
}MyClass内幕
export class MyClass {
public constructor() {
this.myService = CoreModule.injector.get(MyService)
}
}MyClassSon内幕
export class MyClassSon extends MyClass {
public constructor() {
super(); // required for invoke parent build
}
}您可以在MyClass中使用另一种方法,它不需要从子对象调用超级()构造函数。
export class MyClass implements OnInit {
public ngOnInit() {
this.myService = CoreModule.injector.get(MyService)
}
}但对于最后一个方法,请注意不要在未调用父方法的情况下重写子方法中的ngOnInit方法。
此解决方案不符合最佳实践,但运行良好。
编辑
使用抽象类。
export abstract class MyClass {
protected abstract get myService();
}export class MyClassSon extends MyClass {
protected get myService() {
return this._myService;
}
public construction(private _myService: MyService) {
}
}https://stackoverflow.com/questions/58959826
复制相似问题