Для создания сервиса в Angular используется Angular CLI команда:
ng generate service services/MyService
# или сокращенная версия
ng g s services/MyService
Эта команда создаст два файла:
my-service.service.ts - сам сервисmy-service.service.spec.ts - тесты для сервисаБазовый шаблон сервиса выглядит так:
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class MyService {
constructor() { }
}
Ключевые элементы:
@Injectable - декоратор, отмечающий класс как Angular-сервисprovidedIn: 'root' - указывает, что сервис должен быть зарегистрирован в корневом инжектореКак показано выше, использование providedIn: 'root' автоматически регистрирует сервис в корневом модуле:
@Injectable({
providedIn: 'root' // Регистрация в корневом инжекторе
})
export class MyService {}
Преимущества:
Альтернативный способ (менее предпочтительный в Angular 6+):
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule],
providers: [MyService], // Явная регистрация сервиса
bootstrap: [AppComponent]
})
export class AppModule {}
| Характеристика | providedIn: 'root' | Регистрация в модуле |
|---|---|---|
| Деревшакинг | ✅ Поддерживается | ❌ Не поддерживается |
| Ленивая загрузка | ✅ Оптимизировано | ⚠️ Может дублироваться |
| Явная декларация | ❌ Не требуется | ✅ Требуется |
| Область видимости | Глобальная | Зависит от модуля |
providedIn: 'root' по умолчанию, если сервис должен быть синглтономcore/services для глобальных сервисовprovidedIn: FeatureModule@Injectable({
providedIn: 'root'
})
export class DataService {
constructor(private http: HttpClient) {}
}
InjectionToken:export const API_CONFIG = new InjectionToken('api.config');
@Injectable({
providedIn: 'root',
useFactory: () => new ApiConfigService()
})
export class ApiConfigService {}
Создание сервиса:
ng g s)@InjectableРегистрация в корневом модуле:
providedIn: 'root'providers корневого модуляРекомендации:
providedIn: 'root'Правильная регистрация сервисов - ключ к эффективной архитектуре Angular-приложения.