Создание и использование сервисов¶
30.09.2026
Сервисы — переиспользуемые куски кода, общие для приложения Angular. Обычно ими закрывают загрузку данных, бизнес-логику и другую функциональность, к которой обращаются несколько компонентов.
Создание сервиса¶
Сервис можно создать через Angular CLI такой командой:
1 | |
Команда создаёт отдельный файл CUSTOM_NAME.ts в каталоге src.
Сервис можно описать и вручную: декоратор @Service() на классе TypeScript говорит Angular, что класс годится как внедряемая зависимость.
В примере сервис даёт добавлять данные и читать их обратно.
src/app/basic-data-store.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Как сервис становится доступным¶
По умолчанию сервисы предоставляются на корневом уровне. Если сервис предоставлен глобально, Angular даёт три гарантии:
- Один экземпляр. На всё приложение создаётся один общий экземпляр.
- Доступен везде. К нему можно обратиться откуда угодно, без ручной регистрации провайдера.
- Tree-shaking. Если код нигде явно не использует сервис, тот не попадает в итоговый продакшен-бандл.
Декоратор @Service и декоратор @Injectable¶
Декоратор @Service — современная удобная краткая запись привычного @Injectable({ providedIn: 'root' }).
Краткая шпаргалка, какой декоратор подходит:
| Возможность | @Service | @Injectable |
|---|---|---|
Поддержка функции inject() | Да | Да |
| Инъекция через конструктор | ❌ Нет | Да |
| Неявный корневой провайдер-синглтон | Да | ❌ Нет (нужен {providedIn: 'root'}) |
Расширенные ключи провайдера (useClass и др.) | ❌ Нет | Да |
| Свои фабрики инициализации | Да | Да |
Области не на корне (platform и др.) | ❌ Нет | Да |
Подмена реализации фабрикой¶
Если нужно управлять созданием синглтона, например подставить другую реализацию в зависимости от окружения, передайте функцию factory.
Фабрика выполняется в контексте инъекции, поэтому внутри можно вызвать inject() и прочитать другие зависимости.
Сервис Analytics ниже локально ничего не делает: во время разработки события не засоряют консоль. В продакшене фабрика читает токен ANALYTICS_ENABLED и возвращает подкласс GoogleAnalytics, который передаёт события настоящему трекеру.
src/app/analytics.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Параметр factory заменяет у @Injectable параметры useClass, useValue, useExisting и useFactory. Если нужен любой из них, оставайтесь на @Injectable.
Отказ от автоматического предоставления¶
По умолчанию @Service предоставляет класс в корневом инжекторе. Чтобы предоставить его вручную, например ограничить конкретным маршрутом или компонентом, задайте autoProvided: false.
src/app/analytics-logger.ts
1 2 3 4 5 6 7 8 | |
Дальше сервис нужно самим добавить в массив providers, как и обычный @Injectable():
Когда брать @Service, а когда @Injectable¶
Берите @Service, когда создаёте новый класс-синглтон и зависимости берёте через inject(). Оставляйте @Injectable, если нужно что-то из списка:
- Инъекция зависимостей через конструктор.
@Serviceподдерживает только функциюinject(). - Расширенная настройка провайдера, например
useClass,useValue,useExistingилиuseFactory. У@Serviceвместо этого один параметрfactory. - Области не на корне, например
providedIn: 'platform'.
Внедрение сервиса¶
Сервис с providedIn: 'root' внедряют в любом месте приложения функцией inject() из @angular/core.
Внедрение в компонент¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Внедрение в другой сервис¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Следующие шаги¶
providedIn: 'root' закрывает большинство случаев, но для более узких сценариев Angular даёт и другие способы настроить сервисы:
- Свой экземпляр у компонента. Когда компоненту нужен отдельный экземпляр сервиса.
- Ручная настройка. Для сервисов, которым конфигурация нужна во время выполнения.
- Провайдеры-фабрики. Чтобы создавать сервис динамически, по условиям во время выполнения.
- Провайдеры значений. Чтобы предоставить объект конфигурации или константу.
Подробнее об этих приёмах — в следующем руководстве: определение провайдеров зависимостей.
Источник: https://angular.dev/guide/di/creating-and-using-services