Как я могу зарегистрировать своих собственных поставщиков инъекций по всему миру, чтобы обойти циклические зависимости модулей?
Мы можем использовать Angular
Мы также можем определять поставщиков инъекций на основе произвольных токенов внедрения, но, насколько мне удалось выяснить, мы можем передавать их только вновь созданным вложенным инжекторам.
Я работаю над большим приложением на основе Angular, состоящим из множества модулей для разных предметных областей. Многим модулям придется внедрять сервисы из других модулей, что неизменно приводит к циклическим ссылкам (на уровне TypeScript) между модулями.
Код внедряемых сервисов должен оставаться внутри модулей (иначе разбивать все на модули было бы бессмысленно, и в итоге я бы получил один огромный общий модуль).
Однако я могу извлечь интерфейсы для каждого сервиса и поместить их в один или несколько модулей, которые компилируются перед любым из реальных модулей кода. В результате получается следующая структура (изображенная в упрощенном виде — на самом деле вводится токен инъекции, введенный в интерфейс):
Но где и как мне определить статических поставщиков для этих токенов?
- Где: Предположительно, где-то как можно ближе к корню... есть идея объединить всех провайдеров в
массив в компоненте, который представляет корень моего пользовательского интерфейса? - Как: Этот кажется сложнее. Я не могу определить поставщиков в общих модулях, поскольку у них не должно быть доступа к модулям с классами обслуживания. Я думаю, что они не могут быть и в модулях вместе с сервисами, потому что я не знаю, когда они загружаются (по запросу). Как мне добавить это последнее недостающее звено?
Единственное решение, о котором я могу сейчас подумать, — это, по сути, написать свою собственную систему внедрения зависимостей, отдельно от системы Angular, таким образом, чтобы она включала ленивую загрузку модулей, а затем зарегистрировать каждую пару токенов + лениво загружаемый сервисный класс из одного всеобъемлющего модуля. который компилируется последним, но загружается первым.
Контекст: Приложение, над которым я работаю, состоит примерно из 250 модулей. Каждый модуль содержит функциональные возможности, относящиеся к определенной теме предметной области. Эти модули обычно загружаются отложенно при доступе к соответствующим функциям приложения.
Около 150 разработчиков, работающих над приложением, разделены на команды по 5–10 человек (в среднем) в каждой. Каждая команда отвечает за функции, внутреннее техническое проектирование и реализацию нескольких модулей, в предметной области которых они хорошо осведомлены.
Большинство модулей, специфичных для предметной области, используют пару сервисов из нескольких других модулей, специфичных для предметной области, для связывания или объединения функций. Опять же, каждая группа модулей отвечает за проектирование и разработку общедоступного интерфейса своих модулей (например, сервисов, используемых другими модулями).