Есть ли способ украсить ранее предоставленную услугу в угловой - PullRequest
1 голос
/ 09 ноября 2019

Я пытаюсь расширить библиотеку Angular, но моей библиотеке для работы потребуются определенные настройки для одной из служб. Я надеялся, что смогу каким-то образом использовать шаблон декоратора (не декоратор TypeScript) для повторного предоставления сервиса через фабрику. Это может потребовать внедрения ранее объявленной службы в фабрику и либо изменить существующую реализацию, либо вернуть альтернативную версию, которая использует оригинальную. Похоже, что мой фабричный метод вызывается.

export function decoratedTranslateServiceFactory(tranlateService: TranslateService) {
  // either make changes to translateService or return an 
  // alternate version that uses the original one 
  // (i.e. new MyTranslateService(translateService))
}

@NgModule({
  imports: [TranslateModule],
  providers: [
    { 
      provide: TranslateService, 
      useFactory: decoratedTranslateServiceFactory,
      deps: [TranslateService] // <-- Same type as provided
    }
  ] 
})
export class MyTranslateModule {}
@NgModule({
  imports: [TranslateModule, MyTranslateModule]
})
export class AppModule {}

Я надеюсь, что модифицированная версия TranslateService (из фабрики, предоставленной моим модулем) будетв остальной части приложения. Я надеялся, что смогу использовать этот или другой подход для расширения или упаковки существующего сервиса. Это вообще возможно?

Спасибо за любой совет.

Редактировать: Добавление StackBlitz .

1 Ответ

0 голосов
/ 10 ноября 2019

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

Однако, если ваша функция была вызвана, вы должны получить некоторые ошибки, связанные с циклической зависимостью.

Вот моя попытка сделать это:

app.tokens.ts

export class DecoratedService {
  static instance: DecoratedService;

  /* ... */

  constructor () { }

  /* ... */
}

export function decoratedServiceFactory () {
  console.warn('[DECORATING]');
  if (!DecoratedService.instance) {
    DecoratedService.instance = new DecoratedService();
  }

  const service = DecoratedService.instance;

  /* Decorate the service... */

  return service;
}

app.module.ts

/* ... */
{
  provide: DecoratedService,
  useFactory: decoratedServiceFactory,
}
/* ... */

StackBlitz . ( Прокрутите вниз до последней строки )

...