Я создал 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] уже не уникален и мои подписчики в компонентах и прочем места вообще не уведомляются.
Пожалуйста, кто-нибудь может посоветовать, как я могу использовать иерархическую архитектуру, но при этом создать по одному экземпляру каждой службы!
Это было бы ожидаемым поведением при использовании наследования... Почему вы хотите избежать передачи зависимостей в конструкторах?
Думали ли вы о том, чтобы ваш Observable был частной статической переменной, чтобы совместно использовать один и тот же наблюдаемый объект во всех экземплярах, и иметь общедоступный геттер для получения значения, как если бы это было свойство экземпляра?
попробуйте создать декоратор для службы.
@DanielWStrimpel l Я попробовал приват, как показано ниже, но это тоже не сработало _listingSubject = new ReplaySubject(); открытый листингObservable: Observable<QuickList> = this._listingSubject.asObservable();
Вы пробовали это как статическое свойство?
@FanCheung На данный момент вернулись к внедрению конструктора. Позвольте мне попробовать декораторы
@DanielWStrimpel извините, не заметил «статический». Спасибо, это сработало!