Angular Singleton Service
Singleton - это класс, который позволяет создавать только один его экземпляр и предоставляет доступ к этому созданному экземпляру. Он содержит статические переменные, которые могут содержать уникальные и частные экземпляры самого себя. Он используется в сценариях, когда пользователь хочет ограничить создание экземпляра класса только одним объектом.
Одноэлементный сервис - это экземпляр сервиса, который совместно используется компонентами.
Предоставление единого сервиса
В Angular существует два способа сделать сервис одиночным:
- Объявите корень для значения свойства @Injectable () предоставленного
- Включите сервис в AppModule или в модуль, который импортируется только AppModule
Использование предоставлено
Начиная с Angular 6.0, предпочтительным способом создания одноэлементного сервиса является задание в корневом каталоге обеспеченного входа в декораторе @Injectable () службы. Это говорит Angular о предоставлении сервиса в корне приложения.
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class UserService {
}
Массив провайдеров NgModule
В приложениях, созданных с версиями Angular до 6.0, сервисы регистрируются массивами провайдеров NgModule следующим образом:
@NgModule({
...
providers: [UserService],
...
})
Если бы этот NgModule был корневым AppModule, UserService был бы единичным и доступным по всему приложению. Хотя вы можете видеть, что это закодировано таким образом, использование свойстваIn в декораторе @Injectable () для самого сервиса предпочтительнее, чем в Angular 6.0, поскольку оно делает ваши сервисы доступными для дерева.
Шаблон forRoot ()
Как правило, вам понадобится только предоставленный для предоставления услуг и forRoot () / forChild () для маршрутизации. Однако понимание того, как работает forRoot (), чтобы убедиться, что служба является одноэлементной, проинформирует вашу разработку на более глубоком уровне.
Если модуль определяет как поставщиков, так и декларации (компоненты, директивы, каналы), загрузка модуля в несколько функциональных модулей дублирует регистрацию службы. Это может привести к нескольким экземплярам службы, и служба больше не будет работать как одиночная.
Есть несколько способов предотвратить это:
- Используйте предоставленный синтаксис вместо регистрации службы в модуле.
- Разделяйте свои сервисы на собственный модуль.
- Определите методы forRoot () и forChild () в модуле.
Используйте forRoot () для отделения поставщиков от модуля, чтобы вы могли импортировать этот модуль в корневой модуль с поставщиками и дочерними модулями без поставщиков.
- Создайте статический метод forRoot () в модуле.
- Поместите провайдеров в метод forRoot ().
Greeting.module.ts
static forRoot(config: UserServiceConfig): ModuleWithProviders {
return {
ngModule: GreetingModule,
providers: [
{provide: UserServiceConfig, useValue: config }
]
};
}
forRoot () и роутер
RouterModule предоставляет сервис Router, а также директивы маршрутизатора, такие как RouterOutlet и routerLink. Модуль корневого приложения импортирует RouterModule, чтобы приложение имело Маршрутизатор, а компоненты корневого приложения могли получить доступ к директивам маршрутизатора. Любые функциональные модули также должны импортировать RouterModule, чтобы их компоненты могли помещать директивы маршрутизатора в свои шаблоны.
Если у RouterModule не было forRoot (), то каждый функциональный модуль будет создавать новый экземпляр Router, что приведет к поломке приложения, поскольку может быть только один Router. Используя метод forRoot (), модуль корневого приложения импортирует RouterModule.forRoot (...) и получает маршрутизатор, а все функциональные модули импортируют RouterModule.forChild (...), который не создает экземпляр другого маршрутизатора.
Предыдущий: Типы функциональных модулей
Далее: Провайдеры
Новый контент: Composer: менеджер зависимостей для PHP , R программирования