Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке контейнер залежностей?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Контейнер залежностей** (Dependency Injection Container, IoC Container) - це спеціальний механізм, який створює, зберігає і зв'язує об'єкти між собою відповідно до їхніх залежностей. Він реалізує принцип *Inversion of Control (IoC)*: замість того щоб код сам створював свої залежності, контейнер робить це за нього. **Ключове:** контейнер залежностей - це серце системи з Dependency Injection, він керує створенням, зв'язуванням і життям об'єктів, дозволяючи розробнику концентруватися на логіці, а не на тому, хто і як створює залежності.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**Контейнер залежностей** (Dependency Injection Container, IoC Container) - це **спеціальний механізм**, який **створює, зберігає і зв'язує об'єкти** між собою відповідно до їхніх залежностей. Він реалізує принцип *Inversion of Control (IoC)*: замість того щоб код сам створював свої залежності, контейнер робить це за нього. --- ### Простіше кажучи: > Контейнер залежностей - це "фабрика об'єктів", яка знає, **які класи від чого залежать** і **в якому порядку їх створити**, щоб уся система запрацювала. --- ### Як це працює 1. **Ти описуєш зв'язки** між інтерфейсами і реалізаціями: ```java bind(Database.class).to(MySQLDatabase.class); ``` 2. **Коли потрібен об'єкт**, контейнер: - знаходить його залежності, - створює потрібні екземпляри (у правильному порядку), - "вприскує" їх туди, де вони потрібні. 3. **Контейнер керує життєвим циклом** об'єктів: вирішує, де потрібен один спільний екземпляр (singleton), а де - новий при кожному запиті (prototype). --- ### Приклад (на Java, з Guice) ```java public class AppModule extends AbstractModule { @Override protected void configure() { bind(Database.class).to(MySQLDatabase.class); } } public class UserService { private final Database db; @Inject public UserService(Database db) { this.db = db; } } // десь у коді: Injector injector = Guice.createInjector(new AppModule()); UserService service = injector.getInstance(UserService.class); ``` Контейнер сам: - створить `MySQLDatabase`, - підставить її в `UserService`, - віддасть готовий об'єкт. --- ### Що робить контейнер залежностей | Завдання | Що робить | |---|---| | **Створення об'єктів** | Автоматично створює екземпляри потрібних класів. | | **Розв'язання залежностей** | Знаходить, які залежності потрібні класу, і підставляє їх. | | **Управління життєвим циклом** | Контролює, коли об'єкт створюється, переюзається чи знищується. | | **Конфігурація** | Дозволяє налаштовувати, які реалізації використовувати (наприклад, `MySQLDatabase` чи `PostgresDatabase`). | | **Впровадження залежностей** | Впроваджує залежності в поля, конструктори чи сеттери. | --- ### Приклади контейнерів у різних мовах: | Мова | Контейнери | |---|---| | **Java** | Spring IoC, Guice, CDI | | **.NET** | Microsoft.Extensions.DependencyInjection, Autofac, Ninject | | **Python** | dependency-injector, FastAPI Depends | | **JavaScript/TypeScript** | InversifyJS, NestJS | | **PHP** | Symfony DI Container, Laravel Container | --- ### Навіщо він потрібен **Прибирає жорсткі зв'язки** між класами **Полегшує тестування** - можна підміняти залежності **Дозволяє конфігурувати поведінку без зміни коду** **Робить архітектуру масштабованою** **Централізує управління залежностями** --- **Висновок:** > Контейнер залежностей - це серце системи з Dependency Injection. > Він керує створенням, зв'язуванням і життям об'єктів, дозволяючи розробнику концентруватися на логіці, а не на тому, *хто і як створює залежності*.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.