Клас, який сам створює залежності, жорстко прив'язаний до їхніх конкретних реалізацій. DI дозволяє підміняти реалізації — наприклад, у тестах замінити реальний поштовий клієнт на фейковий — без змін у коді класу.
Більшість фреймворків мають вбудований контейнер, який автоматично резолвить залежності: читає конструктор класу, знаходить зареєстровані реалізації інтерфейсів і передає їх. Ви описуєте «що потрібно» — контейнер вирішує «де це взяти».