Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 动态服务注入,带树震动_Angular_Dependency Injection - Fatal编程技术网

Angular 动态服务注入,带树震动

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

我正在尝试创建一个ApiService,它充当Angular 7应用程序中一系列其他服务的包装器。目前,我正在父ApiService的构造函数中注入我的服务:

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时,来自可选服务的源代码仍然包含在主应用程序包中,即使它们在共享服务中被解析为空。我在这里做了一个示例回复:我在自述文件中添加了一些信息,将引导您找到问题区域。嗯,在测试了一点之后,我必须更新我的答案。我只能通过使用抽象模式来实现这一点。请查看更新的答案!哇,太棒了!这会有用的!非常感谢你的帮助,你是个救命恩人。在实现了这个建议之后,我建议对代码进行编辑。