Что, если вы хотите столкновения имен для Angular InjectionToken? - PullRequest
0 голосов
/ 23 сентября 2019

Цель

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

Предостережения и следствия

Предостережение: интерфейс, который должна реализовать служба, не будет определяться этим модулем.

Следствие: Где должен быть определен этот интерфейс?

Нет поставщика для InjectionToken

Функциональный модуль предназначен для использования во многих приложениях в нашей организации.Каждый может реализовать интерфейс для требуемого сервиса по-своему.Если появится новый вариант использования, интерфейс может измениться и запросить изменения в функциональном модуле.

Дизайн, на котором мы остановились, поместил этот интерфейс в общую библиотеку.

ThisВ статье показано, что использование InjectionToken вызывает следующую ошибку 'NullInjectorError: Нет поставщика для InjectionToken ... `

Я создал StackBlitz пример , который иллюстрирует вышеуказанную настройкуи выпуск.

Исследования

В статье 1010 * выше *1033* описывается, как OpaqueToken был разработан для предотвращения случайного столкновения этих строк.Добавим, что позже InjectionToken обернул OpaqueToken для добавления дополнительной поддержки машинописи.

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

Минимальный воспроизводимый пример

См. Этот StackBlitz Контролируемый токен столкновения

Неоптимальное решение

Приведенный выше пример можно исправить, если InjectionTokenзаменить на строку.

Измените следующие два (идентичные файлы) следующим образом:

  • / app / external-feature / lib / shared / i-shared.service.ts
  • /app / internal-adapter / shared / i-shared.service.ts
export const I_SHARED_SERVICE = new InjectionToken<ISharedService>('i-shared-service.shared');
=> 
export const I_SHARED_SERVICE = 'i-shared-service.shared';

В результате потеря поддержки машинописи.Это похоже на шаг назад.

1 Ответ

0 голосов
/ 23 сентября 2019

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

После обсуждения с моим коллегой я понял, что интерфейсный модуль (отдельный пакет npm) решает проблему.

Результат

В результате у меня есть проекты-потребители, проект объектов и проект интерфейса.

проект-потребление : предоставляет адаптермежду функциональным модулем и внутренним потребителем, предоставляя интерфейсный проект InjectionToken.

функциональный проект : предоставляет компонентные компоненты и использует интерфейсный проектный проект InjectionToken.

Проект предоставляет интерфейсы, соответствующие InjectionToken s

...