[英]How to get generic service using wrapper's class generic type?
我正在使用角度5,并尝试减少在类中注入的参数数量。 我不是要讨论服务定位器是否是反模式,请理解angular / typescript是否允许我这样做。
我经常使用服务定位器,但是有一种情况我不知道如何解决,而我读到的有关泛型注入的一些问题并没有太大帮助:/
这是我的情况:
export abstract class BaseComponent<T extends BaseModel> {
protected recordId?: number = undefined;
protected alertService: AlertService;
protected translateService: TranslateService;
protected router: Router;
protected constructor(
protected activatedRoute: ActivatedRoute,
protected store: BaseCrudStore<T>,
protected baseType: { new(): T; }
) {
this.record = new baseType();
this.alertService = ServiceLocator.injector.get(AlertService);
this.translateService = ServiceLocator.injector.get(TranslateService);
this.router = ServiceLocator.injector.get(Router);
//...
}
}
我希望也可以使用服务定位器来解决BaseCrudStore
,而不是通过构造函数注入它。 有没有办法做到这一点? 有没有办法使用服务定位器进入我的商店? 如您所见, BaseCrudStore
也是通用的,并且通用参数与BaseComponent
类相同。
到目前为止,我还不能修复注入ActivatedRoute
。 它确实注入了,但是(很有可能)由于角度的结构,它不代表当前路线,这对于思考它的建造方式是有道理的。 如果您知道如何也解决此问题:)
我对此表示感谢,我的代码正在100%正常工作,这只是困扰我几个月的事情,我无法修复。
ServiceLocator初始化:
export class AppModule {
constructor(private injector: Injector) {
ServiceLocator.injector = this.injector;
}
}
谢谢!
如果您的环境中已经装有注射器,则可以尝试以下操作:
protected store: Store<T>;
protected constructor() {
this.store = AppInjectorService.injector.get<Store<T>>(Store);
}
在Angular 6上测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.