Angular 动态服务注入,带树震动
我正在尝试创建一个ApiService,它充当Angular 7应用程序中一系列其他服务的包装器。目前,我正在父ApiService的构造函数中注入我的服务:Angular 动态服务注入,带树震动,angular,dependency-injection,Angular,Dependency Injection,我正在尝试创建一个ApiService,它充当Angular 7应用程序中一系列其他服务的包装器。目前,我正在父ApiService的构造函数中注入我的服务: import { Injectable, Inject } from '@angular/core'; import { StoreInfoService } from '@services/store-info/1.0/store-info.service'; import { MenuService } from '@service
import { Injectable, Inject } from '@angular/core';
import { StoreInfoService } from '@services/store-info/1.0/store-info.service';
import { MenuService } from '@services/menu/1.0/menu.service';
@Injectable({
providedIn: 'root'
})
export class ApiService {
constructor(
@Inject(MenuService) public menu: MenuService,
@Inject(StoreInfoService) public storeInfo: StoreInfoService,
) {}
}
这很好,允许我通过以下操作调用API端点:
api.storeInfo.get('S9293')
但这不允许我利用摇树的机会。我在ApiService中注入的每一项服务都将包含在我的应用程序中,我预计ApiService中会包含大量的服务,而不是每个客户都需要使用每一项服务
在充分利用树抖动的同时,有没有办法像这样在父包装器服务中包装服务?我不相信在将服务注入API服务时可以进行适当的树抖动,但我很容易出错 我读了一些书,发现了一些非常棒的信息。这是一个链接,展示了树摇动如何/为什么与新供应商合作 这听起来可能有点奇怪,但您可以尝试的另一种方法是使用CLI设置动态提供程序,您可以在模块中以旧方式提供动态提供程序,并在其中使用服务上的装饰程序。以下是环境ts的一个示例:
// abstract-service.ts
@Injectable()
export abstract class AbstractService1 {
abstract myMethod(value: number): string;
}
// service.ts
@Injectable()
export class Service1 extends AbstractService1 {
constructor() {
super();
}
myMethod(value: number) {
..// do stuff
return '';
}
}
// env ts
export const environment = {
..
specialProviders: [
// no provider and having the AbstractService1 optional only has a reference to the method, no meat!
{ provide: AbstractService1, useClass: Service1 }
],
..
// angular json
"fileReplacements": [
..
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.<my-env>.ts"
}
..
],
// shared service ts
..
constructor(
@Optional() public Service1: AbstractService1,
@Optional() public Service2: MyService2,
) {}
..
// module
providers: [
..
...environment.specialProviders,
..
],
编辑为可选服务添加的抽象类演示,以便在未提供类的情况下,该类的内容不包括在构建中。在使用方法的地方仍然会有方法引用。啊,非常好!我不知道@Optional。我一直在考虑将服务放在某种配置中,环境配置应该可以很好地工作。我今天会试试这个,然后回来汇报。谢谢不幸的是,这似乎不起作用。即使在使用@Optional decorator时,来自可选服务的源代码仍然包含在主应用程序包中,即使它们在共享服务中被解析为空。我在这里做了一个示例回复:我在自述文件中添加了一些信息,将引导您找到问题区域。嗯,在测试了一点之后,我必须更新我的答案。我只能通过使用抽象模式来实现这一点。请查看更新的答案!哇,太棒了!这会有用的!非常感谢你的帮助,你是个救命恩人。在实现了这个建议之后,我建议对代码进行编辑。