Ответ
В Angular есть несколько встроенных DI декораторов:
@Injectable()- помечает класс как сервис, который можно инжектировать
@Injectable({
providedIn: 'root'
})
export class DataService {}
@Inject()- явно указывает токен для инжектирования
constructor(@Inject('API_URL') private apiUrl: string) {}
@Optional()- указывает, что зависимость не обязательна
constructor(@Optional() private logger: LoggerService) {}
@Self()- ищет зависимость только в текущем инжекторе@SkipSelf()- пропускает текущий инжектор@Host()- ограничивает поиск до инжектора хоста
Эти декораторы позволяют гибко управлять процессом внедрения зависимостей в Angular приложениях.
Ответ 18+ 🔞
Слушай, а вот в этом вашем Angular, блядь, с этими инжекциями зависимостей — там же целый зоопарк декораторов! Прям как в детском саду: каждому — по ленточке, каждому — по декоратору. И все они, сука, нужны, чтобы твой код не превратился в сплошное ручное управление, как трактор без руля.
Вот смотри, первый и главный — это @Injectable(). Без него твой сервис — просто хуй с горы, никто его инжектить не будет. Это как паспорт для класса: «Я, блядь, сервис, меня можно в конструктор тыкать».
@Injectable({
providedIn: 'root' // Эта хуйня говорит: «Ребята, я буду один на всё приложение, не плодите меня»
})
export class DataService {}
Дальше идёт @Inject(). Это для особо хитрожопых случаев. Ну вот, например, тебе нужно не класс заинжектить, а какую-то строку, которую ты в конфиге прописал. И ты такой: «Э, framework, дай-ка мне сюда 'API_URL'». А он тебе: «А нахуй? Я классы только инжекчу». Вот тут ты и пишешь @Inject('API_URL'), и он, сука, понимает.
constructor(@Inject('API_URL') private apiUrl: string) {}
Потом есть @Optional(). Это когда ты говоришь: «Слушай, Angular, если этой хуйни нет — ну и похуй, не надо орать ошибками, просто дай null». Спасение для плагинов или фич, которые могут быть, а могут и не быть.
constructor(@Optional() private logger: LoggerService) {}
А вот дальше начинается магия, блядь, для настоящих архитектурных гурманов. @Self(), @SkipSelf() и @Host().
@Self() — это такой максималист. Он ищет зависимость ТОЛЬКО в своём, ближайшем инжекторе. Не полезет к папе, не полезет к деду. Не нашёл здесь? Ну, извини, пиздец, ошибка инжекции.
@SkipSelf() — полная его противоположность, хитрая жопа. Он своему инжектору говорит: «Ты, брат, отдохни, я сам». И начинает искать на уровень выше, у родителя. Используется, чтобы избежать циклических зависимостей, когда отец и сын друг у друга что-то просят — получается ёперный театр.
Ну и @Host() — это вообще граничный патруль. Он ищет зависимость, но только до «хост»-компонента. Часто используется внутри директив, чтобы не провалиться куда не надо.
Короче, вся эта банда декораторов позволяет тебе управлять этим DI-цирком с такой точностью, что можно, блядь, иголкой в стоге сена управлять. Главное — не перемудрить, а то получится такая спагетти-архитектура, что сам через месяц разбираться не захочешь, в рот меня чих-пых!