Сервисы нужны для сокращения дублированного кода. Сервисы также могут обеспечивать связь между компонентами, а также доступ к любой другой бизнес-логике.
Два способа внедрения сервиса:
- на уровне приложения
- на уровне компонента (и всех его дочерних компонентов)
Внедрение сервиса на уровне приложения создает один единственный экземпляр этого сервиса. Это удобно когда нам нужно шарить данные между различными компонентами или модулями.
Внедрение сервиса на уровне компонента, создает новый экземпляр сервиса для каждого компонента в отдельности.
Чтобы начать использовать сервис, его нужно добавить в массив providers модуля, а затем инжектировать его в директиву, использую constructor. Чтобы инжектировать сервис в другой сервис нужно использовать декоратор @Injectable.
@Injectable()
export class MessageService {
//injected service
constructor(private errorService: ErrorService) {}
}Singleton service - это сервис у которого только одни экземпляр на всё приложение.
В Angular жизненный цикл сервиса относится к процессу его создания, использования и уничтожения в приложении. Кратко это выглядит так:
-
Регистрация: Сервисы регистрируются в системе внедрения зависимостей (DI) Angular с помощью провайдеров в модулях, компонентах или других декораторах (@Injectable).
-
Создание экземпляра: Когда компонент или другой сервис запрашивает зависимость, DI Angular создает единственный экземпляр сервиса (по умолчанию — singleton), если не указано иначе.
-
Внедрение: Экземпляр сервиса внедряется в запрашивающий компонент или сервис.
-
Использование: Сервис предоставляет данные, методы или логику компонентам или другим сервисам.
-
Уничтожение: Сервисы обычно существуют в течение всего времени работы приложения и уничтожаются только при завершении приложения или связанной области (например, лениво загружаемого модуля).
Ключевые моменты:
Сервисы-одиночки (Singleton) существуют на протяжении всего времени работы приложения.
Сервисы с ограниченной областью (например, в лениво загружаемых модулях) уничтожаются вместе с их областью.
Чтобы зарегистрировать сервис в providers, нужно использовать декоратор @Injectable и указать свойство providedIn.
@Injectable({
providedIn: "root",
})
export class MessageService {
constructor() {}
}Чтобы использовать сервис в компоненте, нужно инжектировать его в конструктор компонента.
@Component({
selector: "app-message",
template: ` <h1>Message</h1> `,
})
export class MessageComponent {
constructor(private messageService: MessageService) {}
}