Angular наследование класса, как расширить базовый класс без инъекций внутри дочернего класса - PullRequest
0 голосов
/ 02 мая 2020

Angular 8

Таким образом, цель расширения базового класса заключается в том, чтобы у дочерних классов были методы, предоставляемые родительским классом. Тем не менее, базовый класс нуждается в некоторых инъекциях различных услуг. Эти услуги не нужны классам Chind. Пример:

// The parent class which will be extended by the many children 
export class parentClass {
  constructor(private service1: service1Service) {
  }

  protected action1(): any {
    return this.service1.someFunc();
  }

  public action2(): any {
    return this.service1.someFunc2();
  }
}

// One of the child classes which doesn't care about service1Service, but is required to inject it anyway...
export class childClass extends parentClass {
  constructor(service1: service1Service) {
    super(service1);
  }

  public doSomething() {
    const data = this.action1();
    // bla bla bla
  }
}

Итак, большая проблема в том, что каждый дочерний класс должен внедрить этот сервис service1Service, даже если он им вообще не нужен.

Мой вопрос: есть ли способ внедрить сервисы внутри родительского класса, не требуя, чтобы их вводили внутри ребенка? Пример выше очень упрощен. В реальной ситуации в родительский класс будет введено около 5 служб. Родительский класс будет использоваться разными членами команды, которым действительно не нужно заботиться об используемых там службах, потому что они строят свои собственные классы поверх родительского класса и используют родительские методы для извлечения данных или выполнения вычислений.

Я знаю, что может быть один полу-хороший вариант:

import { Injector } from '@angular/core';
export class parentClass {
  constructor(private injector: Injector) {}
  protected action1(): any {
    const s1 = this.injector.get(service1Service);
    return s1.someFunc();
  }
}

import { Injector } from '@angular/core';
export class childClass extends parentClass {
  constructor(injector: Injector) {
    super(injector);
  }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...