Для создания сервиса в 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-приложения.