Как определить угловую иерархию классов с сервисными зависимостями - PullRequest
0 голосов
/ 26 октября 2018

В этом у меня голова кружится кругами.

Я хочу создать классы для представления данных, возвращаемых из серверной части в Angular (не AngularJS).

У меня два верхаклассы уровня Variation и Reallocation.Оба типа базового класса Adjustment.Поэтому и Variation, и Reallocation расширяются Adjustment.Большая часть определения класса относится к классу Adjustment с небольшими, но важными различиями между двумя производными классами.

Кажется, имеет смысл использовать класс Adjustment для обработки большей части сообщенийс фоном.То есть, я хочу получить Variation.Я должен быть в состоянии передать идентификатор методу getAdjustment, равному Variation, и заставить его вернуть экземпляр Variation, заполненный данными с сервера.

Пока все это логично для меняи я МОГУ заставить его работать.

Проблема в том, что где-то на линии мне приходится использовать сервис для получения данных из бэкэнда.Я использую AngularFirestore для получения данных.

Итак, в моем Adjustment классе я должен включить конструктор в следующие строки:

constructor(
     public afs: AngularFirestore,
     ....){}

Проблема в том, когдаЯ пришел, чтобы использовать super () в моем производном классе.Я также должен внедрить AngularFirestore в производный класс.То есть у меня должно быть что-то вроде:

export class Variation extends Adjustment {
....
constructor(
    afs: AngularFirestore,
    .... ) {}
super (afs,
        ....)

Класс Variation на самом деле не должен ничего знать о AngularFirestore, но я должен внедрить его в этот класс, чтобы включить его вAdjustment класс.

Должен быть способ избежать этого, но я просто не могу понять это.

1 Ответ

0 голосов
/ 28 октября 2018

Редактировать

Я заменил свой предыдущий ответ следующим:

Я провел еще несколько исследований по инжекторам и нашел этот ответ: https://stackoverflow.com/a/37482645/5348742.

Мы знаемAngular поддерживает инжектор для всего применения.Мы можем получить доступ к этому инжектору, создав свойство типа Injector на любом уровне модуля, который нам нужен.Если мы зарегистрировали службу в root, мы можем получить инжектор в app.module.

Таким образом, нам не нужно получать инжектор для службы в конструкторе.

Мы получаем ссылку на службу в app.module, экспортируем ее и затем используем ее в любом месте, где нам это нужно.

Для получения дополнительной информации о получении ссылки на услугу см. Ссылку выше.

Что касается его использования в другом месте приложения, оно выглядит примерно так:

В app.module

...

export let myService: MyService;

export class AppModule {

constructor(private router: Router,
        private injector: Injector){
        appInjector = this.injector;
        myService = appInjector.get(MyService)
  }
}

А затем в компоненте или классе, где вы хотите его использовать:

import { myService } from 'app.module'

...

export class MyClass {

constructor(...){...}

  getSomething(){
    const something = myService.doSomething()
  }
}

Таким образом, мы можем использовать сервис, не объявляя его в конструкторе.

...