我使用的是angular 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
。它确实注入了,但(很可能)由于angular的结构,它并不代表当前的路由,这在思考它是如何构建的时候是有意义的。如果您还知道如何修复此问题:)
我很感谢你在这方面的帮助...我的代码100%正常工作,只是这几个月来一直困扰着我,我无法修复它。
ServiceLocator初始化:
export class AppModule {
constructor(private injector: Injector) {
ServiceLocator.injector = this.injector;
}
}
谢谢!
发布于 2018-06-22 23:59:58
如果您的环境中已经有了一个注入器,您可以尝试如下所示:
protected store: Store<T>;
protected constructor() {
this.store = AppInjectorService.injector.get<Store<T>>(Store);
}
在Angular 6上进行了测试。
https://stackoverflow.com/questions/47722578
复制相似问题