Я довольно много читал о системе внедрения угловых зависимостей, но все еще не могу найти ответ на один очень специфический вопрос.
Поставщики, зарегистрированные через массив @Module
'providers: []
, «подхватываются» текущим (ближайшим родительским) инжектором модуля. Как правило, они регистрируются в корневом инжекторе, если только модуль не загружен с отложенной загрузкой, который создает отдельный контекст внедрения, который работает как блок {} (внешние провайдеры доступны внутри, но не наоборот, а внутренние провайдеры имеют преимущество) , Если провайдеры зарегистрированы в массиве @Component
providers: []
, они также вводятся в отдельном контексте, который включает только сам компонент и его дочерние элементы.
Однако, что происходит со службами, зарегистрированными в декораторе @Service()
, для меня загадка. Что если сервис никогда нигде не используется? Или что, если @Service({providedIn: root})
используется только в модуле с отложенной загрузкой? А что если это providedIn: SomeLazyLoadedModule
? И стоит ли когда-либо упоминать такие сервисы в массиве providers
модуля?
Единственная конкретная информация, которую мне удалось найти по этой теме, была: «Компилятор AOT может выполнить некоторые оптимизации, такие как встряхивание дерева», которые, честно говоря, не очень многое прояснили.
Пожалуйста, не стесняйтесь поправлять меня, если некоторые из приведенных выше утверждений неверны.