Angular 5 – Как создать экземпляр Single Service в иерархической архитектуре?

avatar
nsk
8 апреля 2018 в 00:37
193
0
0

Я создал BaseService, CommonService, как показано ниже, и другие мои службы зависят от этой иерархии. Мое главное намерение состояло в том, чтобы повторно использовать utilService и cacheService во всех моих ModuleServices [существует много ModuleServices].

export abstract class BaseService {
  public utilService: UtilService;
  _listingSubject = new ReplaySubject();
  public listingObservable: Observable<QuickList> = this._listingSubject .asObservable();
  constructor() {
  super();
    this.utilService = ServiceLocator.injector.get(UtilService);
  }
}

export class CommonService extends BaseService {
  public cacheService: CacheService;
  constructor() {
  super();
    this.cacheService = ServiceLocator.injector.get(CacheService);
  }
}

export class ModuleServiceA extends CommonService {
  constructor() {
    super();
  }
}

Я объявил свои услуги в списке провайдеров в AppModule — нет вводится на уровне компонента

@NgModule({
  providers: [CommonService, ModuleServiceA..]
  ...
})
export class AppModule {}

Я не мог внедрить непосредственно в конструктор, как показано ниже, который затем обязал бы все дочерние службы также объявлять со всеми аргументами. Чего я хотел избежать.

constructor(public cacheService: CacheService)

Однако с вышеприведенной иерархической архитектурой, поскольку я вызываю конструктор super() в каждой дочерней службе, создается новый экземпляр BaseService/CommonService, что противоречит основной цели.

Кроме того, Observable создается в BaseService [listingObservable] уже не уникален и мои подписчики в компонентах и ​​прочем места вообще не уведомляются.


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

Источник
Daniel W Strimpel
8 апреля 2018 в 21:51
0

Это было бы ожидаемым поведением при использовании наследования... Почему вы хотите избежать передачи зависимостей в конструкторах?

Daniel W Strimpel
8 апреля 2018 в 21:54
1

Думали ли вы о том, чтобы ваш Observable был частной статической переменной, чтобы совместно использовать один и тот же наблюдаемый объект во всех экземплярах, и иметь общедоступный геттер для получения значения, как если бы это было свойство экземпляра?

Fan Cheung
9 апреля 2018 в 02:07
0

попробуйте создать декоратор для службы.

nsk
11 апреля 2018 в 03:23
0

@DanielWStrimpel l Я попробовал приват, как показано ниже, но это тоже не сработало _listingSubject = new ReplaySubject(); открытый листингObservable: Observable<QuickList> = this._listingSubject.asObservable();

Daniel W Strimpel
11 апреля 2018 в 03:26
0

Вы пробовали это как статическое свойство?

nsk
11 апреля 2018 в 03:26
0

@FanCheung На данный момент вернулись к внедрению конструктора. Позвольте мне попробовать декораторы

nsk
11 апреля 2018 в 03:33
0

@DanielWStrimpel извините, не заметил «статический». Спасибо, это сработало!

Ответы (0)