Если вы начнете по маршруту DI, у вас очень скоро появятся ограничители, которые принимают 20 параметров для различных зависимостей, в которых нуждается объект.Получение этих 20 параметров потребует получения 20 других параметров для их построения.И затем, в конце (начале?) Всего этого, вы поймете, что вы просто подключили себя к конкретной реализации вашего тщательно продуманного интерфейса (вызвав конструктор).А затем, через 6 месяцев, вы добавите новую зависимость, которая потребует от вас отследить все существующие вызовы и изменить их.
Структура DI в основном позаботится об этом.Стоя между вами и конструктором, он может запрашивать конфигурацию (может быть, XML, может быть, код), которая говорит ему, что делать, когда ему нужен конкретный объект.
Основы довольно просты с любым языком, который имеет некоторый вид самоанализа (зарегистрируйте конкретный тип для удовлетворения интерфейса, когда вам нужен экземпляр интерфейса, а затем создайте экземпляр типа. Прогуляйтесь по графику, созданному конструктороми повторить.) когда это усложняется, когда вы также хотите управлять временем жизни объекта (этот класс Logger должен создаваться только один раз, а затем использоваться повторно. Этот DataAccessFacade должен создаваться один раз для каждого потока и т. д.) илидинамически выбирать, как удовлетворить зависимость.Инфраструктура DI обычно предоставляет как средства создания объектов (вычисляют зависимости, необходимые для конструктора), так и средство Service Locator, так что не все должно передаваться в конструкторе или в качестве параметра для методов.Это позволяет вам регистрировать типы с помощью произвольно сложных конструкторов, получать его экземпляр, и вам не нужно беспокоиться о том, когда или как совместно использовать экземпляр, когда он создан, когда он уничтожен или связан с реальным типом.
Проектирование библиотек с использованием DI также позволяет пользователям при необходимости обмениваться зависимостями, что дает большую гибкость в сочетании с интерфейсами или наследованием, не загромождая ваш код аргументами конструктора или метода для каждой зависимости.