Как переопределить сервисы, введенные в угловой компонент - PullRequest
0 голосов
/ 16 октября 2018

Мы создаем среду приложений, управляемую cms, с Angular.Мы поставляем несколько пакетов, которые клиенты могут использовать для дальнейшей настройки пользовательского интерфейса или логики.По этой причине компоненты будут делегировать свою логику службе, поскольку потенциальные клиенты могут предоставлять пользовательскую услугу (мы избегаем наследования компонентов).

Компоненты размещаются динамически и инициализируются уникальным набором данных,хранение данных CMS.Предоставленные сервисы будут наследовать эти данные от инжектора компонента.Это прекрасно работает, однако, когда предоставляется пользовательский сервис (с использованием InjectionToken), мы сталкиваемся с 2 проблемами:

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

Кто-нибудь еще сталкивался с подобной архитектурной проблемой?

1 Ответ

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

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

что-то вроде

@Injectable()
export class MyPFactory {
  public create(): MyP {
    return new MyP();
  }
}

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

Таким образом, MyP не должен быть оформлен как Injectable, поскольку фабрика создаст еговызов метода create в компонентах / директивах, которые будут его использовать.

https://en.wikipedia.org/wiki/Factory_method_pattern

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...