Що таке контейнер залежностей?
Контейнер залежностей (Dependency Injection Container, IoC Container) - це спеціальний механізм, який створює, зберігає і зв'язує об'єкти між собою відповідно до їхніх залежностей.
Він реалізує принцип Inversion of Control (IoC): замість того щоб код сам створював свої залежності, контейнер робить це за нього.
Простіше кажучи:
Контейнер залежностей - це "фабрика об'єктів", яка знає, які класи від чого залежать і в якому порядку їх створити, щоб уся система запрацювала.
Як це працює
- Ти описуєш зв'язки між інтерфейсами і реалізаціями:
bind(Database.class).to(MySQLDatabase.class);- Коли потрібен об'єкт, контейнер:
- знаходить його залежності,
- створює потрібні екземпляри (у правильному порядку),
- "вприскує" їх туди, де вони потрібні.
- Контейнер керує життєвим циклом об'єктів: вирішує, де потрібен один спільний екземпляр (singleton), а де - новий при кожному запиті (prototype).
Приклад (на Java, з Guice)
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. Він керує створенням, зв'язуванням і життям об'єктів, дозволяючи розробнику концентруватися на логіці, а не на тому, хто і як створює залежності.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.