angular - 扩展已注入(inject)服务的类而不在子类中重复注入(inject)器?

标签 angular typescript inheritance dependency-injection

好的,我正在深入研究 TypeScript 继承(特别是在 Angular 11 中),并且我已经设置了 BasePageComponent提供跨页面存在的所有必要的功能和服务。 我遇到的问题是,现在我的基础变得臃肿,因为有些服务仅在一两个页面上使用,但为了扩展基础,我们将这些服务包含在基础中。

export class BasePageComponent {

  constructor(
    public uiPopupService: UiPopUpService,
    public loaderService: LoaderService,
    public questionService: QuestionService,
    public aBunchOfOthers: OTHERS,
    public exampleOneOffService: ExampleOneOffService
  ) {}
}

我意识到重复所有注入(inject)的服务,然后将它们全部传递到 BasePageComponent 会更高效。如下:

export class ChildPageComponent extends BasePageComponent {

  constructor(
    public uiPopupService: UiPopUpService,
    public loaderService: LoaderService,
    public questionService: QuestionService,
    public aBunchOfOthers: OTHERS,
    private exampleOneOffService: ExampleOneOffService
  ) {
    super(uiPopupService, loaderService, questionService, aBunchOfOthers);
  }
}

如果没有其他方法,我将执行上述操作,但正如示例代码中所暗示的那样,我有一堆其他微服务包含在基础中(例如 15-20),所以我想要能够做这样的事情,我只声明一个附加服务,并且仍然从父类继承所有其他服务,但我没有找到一种方法来做到这一点。

export class ChildPageComponent extends BasePageComponent {

  constructor(private otherExampleService: OtherExampleService){
    super() 
  };
}

这种模式是否存在,只是我没有在谷歌上搜索正确的关键字?

最佳答案

这有点讽刺,您使用继承来避免依赖注入(inject),而实际上您应该使用依赖注入(inject)来避免继承。如果组件具有共享服务,您所需要做的就是将所需的服务放入构造函数中,然后就完成了。

如果它们具有共享功能,您可以将这些功能放入服务中。如果它们具有共享变量,您可以使用服务来传递数据。关键是将组件作为自己独立的实体,因此如果您更改一个组件,它不会影响任何其他组件。

服务遵循同样的理念,因为您可以更改服务的实现,而无需触及使用该服务的任何文件。考虑一下您的设计,如果您需要删除基础组件或向基础组件添加服务,会发生什么情况?您现在需要去编辑整个项目中的所有其他组件。当您将服务注入(inject)组件时,它也会创建该服务的实例。通过将所有服务注入(inject)每个组件中,您正在创建无数浪费内存和处理能力的实例。你真的得到任何返回吗?

我想说的是你应该尽量避免扩展组件。 Angular 提供了更好的设计理念。

要回答您的问题,是的,您可以创建一项全局服务来导入所有其他服务,然后注入(inject)该大型服务。然后您可以扩展该服务并导入更多服务。但出于对所有神圣事物的热爱,请不要这么做。

关于angular - 扩展已注入(inject)服务的类而不在子类中重复注入(inject)器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71041459/

相关文章:

Angular5 调试在 Chrome 中不起作用

javascript - Angular/Typescript 仅获取 1 条记录及其 id 值

asp.net-web-api - 无法在 ASP.NET Core 1.0 中启用跨源请求 (CORS)

Angular ControlValueAccessor registerOnChange 回调被覆盖

导入声明的 TypeScript 问题

javascript - 以 Angular 自动为页面的所有元素分配 ID

angular - 在不使用 jQuery 将图像上传到服务器之前,如何从输入标签获取 Angular 2(或更高版本)图像的高度和宽度?

c++ - 在声明派生类时调用基类的构造函数

java - 使用 super 将变量提升为抽象父类(super class)是否比在子类中分配它有好处?

c++ - 可选功能的设计模式?