Декоратор @Injectable в Angular выполняет две ключевые функции:
Помечает класс как участвующий в системе Dependency Injection (DI)
Это означает, что Angular может создавать экземпляры этого класса и внедрять в него зависимости.
Позволяет указать область видимости (scope) сервиса
Через параметр providedIn можно определить, где будет доступен сервис.
Пример:
@Injectable({
providedIn: 'root' // Сервис будет singleton на уровне приложения
})
export class DataService {}
Важно: Хотя @Injectable обязателен для сервисов, его можно опустить для компонентов, директив и pipes, так как они уже декорированы @Component, @Directive, @Pipe.
Angular создает древовидную структуру инжекторов, соответствующую структуре компонентов:
Когда компоненту или сервису нужна зависимость:
Зависимости можно регистрировать несколькими способами:
// 1. В декораторе Injectable
@Injectable({ providedIn: 'root' })
// 2. В массиве providers модуля
@NgModule({
providers: [MyService]
})
// 3. В массиве providers компонента
@Component({
providers: [MyService]
})
Angular предоставляет модификаторы для управления процессом разрешения зависимостей:
@Optional() - зависимость не обязательна@Self() - искать только в текущем инжекторе@SkipSelf() - пропустить текущий инжектор@Host() - искать только до host компонентаПример:
constructor(
@Optional() private optionalService: OptionalService,
@Host() private hostService: HostService
) {}
Дерево инжекторов позволяет:
Токены используются для идентификации зависимостей:
Пример InjectionToken:
export const API_URL = new InjectionToken<string>('api.url');
@Injectable:
providedInDI в Angular:
Лучшие практики:
providedIn: 'root'InjectionToken