Служба Angular Inject в базовый класс, но не в подкласс, и использование родительского сервиса в подклассах. - PullRequest
2 голосов
/ 25 июня 2019

Использование Angular 7 & Typescript: у меня есть базовый класс, который использует множество сервисов и дочерних классов (около 40 подклассов), и я не хочу добавлять эти сервисы во все конструкторы подклассов и передавать их super() но мне все еще нужно использовать эти сервисы во всех подклассах.


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);
    }
}

Ответы [ 3 ]

1 голос
/ 25 июня 2019

Я использую, чтобы иметь ту же проблему, поэтому я в конечном итоге выполняю DI (внедрение зависимостей) с помощью injector service

, этот статический класс используется для хранения ссылки на службу инжектора

export class AppInjector {

  private static injector: Injector;

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

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

в модуле приложения. Я устанавливаю службу инжекторабазовый компонент

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 ??

1 голос
/ 25 июня 2019

Вы можете использовать глобальный инжектор для предотвращения внедрения всех служб во всех дочерних классах.В вашем случае это будет примерно так:

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()
      }
  }
1 голос
/ 25 июня 2019

Добавьте еще один сервис и добавьте туда все необходимые сервисы. Мы можем просто добавить этот сервис в подкласс и передать его родителю в super.

@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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...