Создание инжектируемой службы¶
2.08.2022
Сервис — это широкая категория, охватывающая любые ценности, функции или возможности, необходимые приложению. Обычно сервис — это класс с узкой, четко определенной целью. Компонент — это один из типов классов, который может использовать DI.
Angular отличает компоненты от сервисов для повышения модульности и возможности повторного использования. Отделяя функции компонента, связанные с представлением, от других видов обработки, вы можете сделать свои классы компонентов компактными и эффективными.
В идеале задача компонента — обеспечить удобство работы пользователя и не более того. Компонент должен представлять свойства и методы для связывания данных, чтобы быть посредником между представлением (отображаемым шаблоном) и логикой приложения (которая часто включает в себя некоторое понятие модели).
Компонент может делегировать определенные задачи сервисам, например, получение данных с сервера, проверку пользовательского ввода или ведение журнала непосредственно в консоли. Определяя такие задачи обработки в классе инжектируемого сервиса, вы делаете эти задачи доступными для любого компонента. Вы также можете сделать свое приложение более адаптируемым, внедряя различных поставщиков одного и того же вида услуг в зависимости от обстоятельств.
Angular не навязывает эти принципы. Angular помогает вам следовать этим принципам, упрощая разделение логики приложения на сервисы и делая эти сервисы доступными для компонентов через DI.
Примеры сервисов¶
Вот пример класса сервиса, который ведет журнал в консоль браузера.
1 2 3 4 5 6 7 8 9 10 11 | |
Сервисы могут зависеть от других сервисов. Например, вот HeroService, который зависит от сервиса Logger, а также использует BackendService для получения героев.
Этот сервис, в свою очередь, может зависеть от сервиса HttpClient для асинхронного получения героев с сервера.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
Создание инжектируемого сервиса¶
Angular CLI предоставляет команду для создания нового сервиса. В следующем примере вы добавляете новый сервис в ваше приложение, которое было создано ранее с помощью команды ng new.
Чтобы создать новый класс HeroService в папке src/app/heroes, выполните следующие шаги:
-
Выполните эту команду Angular CLI:
1ng generate service heroes/heroЭта команда создает следующую службу по умолчанию
HeroService.1 2 3 4 5 6
import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root', }) export class HeroService {}Декоратор
@Injectable()указывает, что Angular может использовать этот класс в системе DI. МетаданныеprovidedIn: 'root'означают, чтоHeroServiceвиден во всем приложении. -
Добавьте метод
getHeroes(), который возвращает героев изmock.heroes.tsдля получения имитационных данных героев:1 2 3 4 5 6 7 8 9 10 11 12 13
import { Injectable } from '@angular/core'; import { HEROES } from './mock-heroes'; @Injectable({ // declares that this service should be created // by the root application injector. providedIn: 'root', }) export class HeroService { getHeroes() { return HEROES; } }Для ясности и удобства сопровождения рекомендуется определять компоненты и сервисы в отдельных файлах.
Инжектирование сервисов¶
Чтобы внедрить сервис в качестве зависимости в компонент, вы можете использовать функцию constructor() компонента и указать в аргументе конструктора тип зависимости. Следующий пример указывает HeroService в конструкторе HeroListComponent. Тип heroService — HeroService. Angular распознает HeroService как зависимость, поскольку этот класс был ранее аннотирован декоратором @Injectable.
1 | |
Инжектирование сервисов в другие сервисы¶
Когда сервис зависит от другого сервиса, следуйте той же схеме, что и при инъекции в компонент. В следующем примере HeroService зависит от сервиса Logger, чтобы сообщать о своих действиях.
Сначала импортируйте службу Logger. Затем внедрите службу Logger в конструктор() службы HeroService, указав private logger: Logger.
Здесь constructor() указывает тип Logger и хранит экземпляр Logger в приватном поле logger.
В следующих вкладках кода представлены сервис Logger и две версии HeroService. Первая версия HeroService не зависит от сервиса Logger. Переработанная вторая версия зависит от службы Logger.
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 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
В этом примере метод getHeroes() использует службу Logger, записывая в журнал сообщение при получении героев.
Что дальше¶
- Как настроить зависимости в DI
- Как использовать
InjectionTokensдля предоставления и инъекции значений, отличных от сервисов/классов - Инъекция зависимостей в действии