Когда предоставляется услуга Angular 2+? - PullRequest
0 голосов
/ 05 июля 2018

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

Поставщики, зарегистрированные через массив @Module 'providers: [], «подхватываются» текущим (ближайшим родительским) инжектором модуля. Как правило, они регистрируются в корневом инжекторе, если только модуль не загружен с отложенной загрузкой, который создает отдельный контекст внедрения, который работает как блок {} (внешние провайдеры доступны внутри, но не наоборот, а внутренние провайдеры имеют преимущество) , Если провайдеры зарегистрированы в массиве @Component providers: [], они также вводятся в отдельном контексте, который включает только сам компонент и его дочерние элементы.

Однако, что происходит со службами, зарегистрированными в декораторе @Service(), для меня загадка. Что если сервис никогда нигде не используется? Или что, если @Service({providedIn: root}) используется только в модуле с отложенной загрузкой? А что если это providedIn: SomeLazyLoadedModule? И стоит ли когда-либо упоминать такие сервисы в массиве providers модуля?

Единственная конкретная информация, которую мне удалось найти по этой теме, была: «Компилятор AOT может выполнить некоторые оптимизации, такие как встряхивание дерева», которые, честно говоря, не очень многое прояснили.

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

1 Ответ

0 голосов
/ 05 июля 2018

Прежде всего, нет @Service декоратора. Он называется @Injectable.

Если вы украшаете сервис только с помощью @Injectable(), то он нигде не предоставляется, если только вы не добавите его в массив providers модуля или компонента.

Если вы украсите его с помощью @Injectable({ providedIn: 'root' }), то оно предоставляется в корневом модуле, то есть эквивалентно добавлению его в массив провайдеров корневого модуля , за исключением , что позволяет полностью игнорировать службу и не добавлять его в какой-либо пакет, если он никогда нигде не внедряется: в этом случае, поскольку он не входит ни в один другой импорт файла TypeScript, его можно потрясти деревом: ничто не использует этот сервис, поэтому связывание его бесполезно.

Если вы украсите его с помощью @Injectable({ providedIn: SomeModule }), то это предусмотрено в модуле SomeModule, то есть эквивалентно добавлению его в массив провайдеров модуля SomeModule, с тем же исключением, что и выше, то есть, если его не импортирует ничего, это может быть дерево встряхивали.

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