Dependency Injection
Интерактивное демо «Dependency Injection» — раздел Энциклопедия · Код и разработка.
💉 Dependency Injection (DI)
DIP — "что": зависеть от абстракций. DI — "как": передавать зависимости извне (конструктор, setter, IoC).
DIP vs DI: принцип задаёт направление зависимостей, инъекция — механизм передачи реализации в класс.
👤 User
→⚙️ UserServiceconstructor
→📧 IEmailService
Способ внедрения
Сравнение способов
| Критерий | Constructor | Setter | Field | Method |
|---|---|---|---|---|
| Обязательность | Обязательная | Опциональная | Неочевидна | На вызов |
| Изменяемость | Иммутабельная | Мутабельная | Мутабельная | Не хранится |
| Тестируемость | Легко | Доп. код | Сложно | Легко |
| Рекомендация | Лучший | Опциональные deps | Избегать | Один вызов |
Реализация IEmailService
Выбери тип инъекции и нажми "Зарегистрировать"
Код: Constructor
// Constructor Injection (рекомендуется)
class UserService {
private final EmailService emailService;
public UserService(EmailService emailService) {
this.emailService = emailService;
}
}IoC / DI-контейнер
IEmailService регистрируется как singleton — один экземпляр на всё приложение.
// IoC-контейнер управляет жизненным циклом container.register<IEmailService, SmtpEmailService>(Lifetime.Singleton); container.register<UserService>(); var userService = container.resolve<UserService>();