如何使用包装器类通用类型获得通用服务?

时间:2017-12-08 21:41:41

标签: angular typescript

我正在使用角度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 init:

export class AppModule {
    constructor(private injector: Injector) {
        ServiceLocator.injector = this.injector;
    }
}

谢谢!

1 个答案:

答案 0 :(得分:4)

如果您的环境中已有注射器,则可以尝试以下操作:

protected store: Store<T>;

protected constructor() {
    this.store = AppInjectorService.injector.get<Store<T>>(Store);
}

在Angular 6上进行了测试。