【问题标题】:Angular inject service into base class but not in sub-class and use the parent service in sub-classesAngular将服务注入基类但不在子类中,并在子类中使用父服务
【发布时间】:2019-11-06 23:47:38
【问题描述】:

使用 Angular 7 和 Typescript:我有一个使用大量服务和子类(大约 40 个子类)的基类,我不想在所有子类构造函数中添加这些服务并将它们传递给 @987654322 @ 但我仍然需要在所有子类中使用这些服务。


export class parentTool {

    constructor(type: string, public service1: Service1, public service2: Service2,public service3: Service3, public service4: Service4){}
}

export class ChildTool1 extends parentTool {

    constructor(public service1: Service1, public service2: Service2,public service3: Service3, public service4: Service4) {

        super("tool1", service1, service2, service3, service4);
    }
}

export class ChildTool2 extends parentTool {

    constructor(public service1: Service1, public service2: Service2,public service3: Service3, public service4: Service4) {

        super("tool2", service1, service2, service3, service4);
    }
}

【问题讨论】:

标签: angular typescript angular7


【解决方案1】:

我曾经遇到过同样的问题,所以我最终使用 injector 服务进行手动 DI(依赖注入)

这个静态类用于存储注入器服务的引用

export class AppInjector {

  private static injector: Injector;

  static setInjector(injector: Injector) {
    AppInjector.injector = injector;
  }

  static getInjector(): Injector {
    return AppInjector.injector;
  }
}   

在应用模块我设置了injoctor服务

export class AppModule { 
  constructor(injector:Injector){
      AppInjector.setInjector(injector);// save a injector ref ?
  }
}

您需要在开始执行任何 DI(依赖注入)之前存储服务

在基础组件中

export class BaseComponent {
  protected utilitiesService: UtilitiesService; // ? service
  protected loggingService: LoggingService; // ? service

  constructor() {

      const injector = AppInjector.getInjector();

      this.utilitiesService = injector.get(UtilitiesService); // ? DI
      this.loggingService = injector.get(LoggingService); // ? DI


  }

}

子类现在可以访问注入器类注入的所有服务??

    export class ChildComponent extends BaseComponent {
      constructor() {
        super();
      }
    }

demo ??

【讨论】:

    【解决方案2】:

    再添加一项服务并在其中注入所有必需的服务。我们可以简单地将该服务添加到子类中,然后将其传递给父类。

    @injectable()
    export class ParentService {
        constructor(type: string, private service1: Service1, private service2: Service2,private service3: Service3, private service4: Service4){}
        executeService1(){
            this.service1.method1();
        }
    }
    
    export class parentTool {
        constructor(private parentService: ParentService){}
    }
    
    export class ChildTool1 extends parentTool {
        constructor(public parentService: ParentService) {
            super("tool1", parentService);
        }
    }
    
    export class ChildTool2 extends parentTool {
        constructor(public parentService: ParentService) {
            super("tool2", parentService);
        }
    }
    

    【讨论】:

    • ? 这是一个非常聪明的解决方案,如果你把它结合起来,我的答案会很棒
    • 谢谢。真的没有办法只在parentTool类中提及“parentService”,而不是需要将其注入每个子类中,然后将其作为参数传递吗?
    【解决方案3】:

    您可以使用全局注入器来防止注入所有子类中的所有服务。 在您的情况下,它将是这样的:

    import {Injector} from '@angular/core';
    //other imports
    export class parentTool {
      public service1: Service1
      public service2: Service2
      public service3: Service3
      public service4: Service4
          constructor(type: string,injector: Injector){
            this.serviceInject1 = injector.get(Service1);
            this.serviceInject2 = injector.get(Service2);
            this.serviceInject3 = injector.get(Service3);
            this.serviceInject4 = injector.get(Service4);
          }
      }
    
      export class ChildTool1 extends parentTool {
    
          constructor(injector: Injector) {  
              super(injector);
              this.service1.someMethodCall()
          }
      }
    
      export class ChildTool2 extends parentTool {
    
          constructor(injector: Injector) {  
              super(injector);
              this.service1.someMethodCall()
          }
      }
    

    【讨论】:

    • 正确 ? 但是在我的应用程序中,我们有很多组件,我们不想继续注入注入器类,请检查我的答案
    猜你喜欢
    • 2018-04-21
    • 1970-01-01
    • 2018-06-18
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2017-04-09
    相关资源
    最近更新 更多