Иерархия сервисов¶
Как было показано в предыдущих статьях, мы можем внедрять сервисы в компонентах и модулях. В зависимости от того, где внедряются сервисы, бывают различные уровни провайдеров сервисов. Уровень по сути определяет область действия и жизненный цикл сервиса. Есть три уровня провайдеров сервисов:
- Глобальный или корневой уровень
- Уровень модуля
- Уровень компонента
Для установки соответствующего уровня сервиса есть два способа: добавление сервиса в коллекцию providers
в модуле или компоненте и установка уровня с помощью параметра providedIn
в декораторе @Injectable
.
С одной стороны, может показаться, что нет смысла в таком разделение — почему бы для всех сервисов не сделать один корневой уровень, чтобы один объект сервиса был доступен для всего приложения по типу синглтона. Однако нередко возникает нобходимость разграничить функционал между отдельными функциональными частями приложения. Например, когда два компонента работают с разным набором данных — в этом случае они могут использовать один класс сервиса, но разные его объекты.
Корневой уровень¶
Корневой уровень (root level) предусматривает действие сервиса для всего приложения. Создается и используется один объект сервиса для всех частей приложения.
Подобный уровень устанавливается, если сервис добавляется в коллекцию providers
главного модуля, который обычно называется AppModule
и с запуска которого начинается работа приложения. Например:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Если в данном случае AppModule
является главным модулем, то для сервиса DataService
определен корневой уровень. То есть во время работы приложения будет создаваться один объект данного сервиса для всего приложения.
Значение root
для параметра providedIn
в декораторе Injectable
также позволяет установить корневой уровень действия:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
В этом случае мы можем не добавлять данный сервис в коллекцию providers
у главного модуля.
Уровень модуля¶
Сервисы уровня модуля действуют только для текущего модуля и всех его классов — компонентов, директив, сервисов. Это все те сервисы, которые добавляются в коллекцию providers
во всех других модулях, кроме главного модуля. Например:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Либо мы можем задать уровень модуля непосредствнно в сервисе:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Уровень компонента¶
В этом случае действие сервиса ограничено текущим компонентом. Для каждого объекта компонента создается свой объект сервиса. Сам сервис добавляется также в коллекцию providers
компонента:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|