Skip to main content

Що таке контейнер залежностей?

Контейнер залежностей (Dependency Injection Container, IoC Container) - це спеціальний механізм, який створює, зберігає і зв'язує об'єкти між собою відповідно до їхніх залежностей.

Він реалізує принцип Inversion of Control (IoC): замість того щоб код сам створював свої залежності, контейнер робить це за нього.


Простіше кажучи:

Контейнер залежностей - це "фабрика об'єктів", яка знає, які класи від чого залежать і в якому порядку їх створити, щоб уся система запрацювала.


Як це працює

  1. Ти описуєш зв'язки між інтерфейсами і реалізаціями:
java
bind(Database.class).to(MySQLDatabase.class);
  1. Коли потрібен об'єкт, контейнер:
  • знаходить його залежності,
  • створює потрібні екземпляри (у правильному порядку),
  • "вприскує" їх туди, де вони потрібні.
  1. Контейнер керує життєвим циклом об'єктів: вирішує, де потрібен один спільний екземпляр (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).
Впровадження залежностейВпроваджує залежності в поля, конструктори чи сеттери.

Приклади контейнерів у різних мовах:

МоваКонтейнери
JavaSpring IoC, Guice, CDI
.NETMicrosoft.Extensions.DependencyInjection, Autofac, Ninject
Pythondependency-injector, FastAPI Depends
JavaScript/TypeScriptInversifyJS, NestJS
PHPSymfony DI Container, Laravel Container

Навіщо він потрібен

Прибирає жорсткі зв'язки між класами Полегшує тестування - можна підміняти залежності Дозволяє конфігурувати поведінку без зміни коду Робить архітектуру масштабованою Централізує управління залежностями


Висновок:

Контейнер залежностей - це серце системи з Dependency Injection. Він керує створенням, зв'язуванням і життям об'єктів, дозволяючи розробнику концентруватися на логіці, а не на тому, хто і як створює залежності.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.