Dependency Injection на пальцах?
Архитектурные вопросы сложны по определению. Чтобы их понимать, нужно иметь достаточную базу знаний и опыта программирования. В идеале, чтобы понять паттерн, нужно столкнутся с проблемой, для решения которой он был придуман. Если база знаний и опыта уже есть, а понимания всё ещё нет, то прочитайте учебник, вроде "Чистой архитектуры" Мартина.
А "на пальцах" вам сейчас дадут множество объяснений, большинство которых будут неправильными и запутают ещё больше.
1. SOLID, а конкретно буква D - Dependency inversion principle, который гласит что 'When following this principle, the conventional dependency relationships established from high-level, policy-setting modules to low-level, dependency modules are reversed, thus rendering high-level modules independent of the low-level module implementation details. ', одно из следствий - если тебе в коде нужна зависимость, не нужно создавать её руками, проси чтобы её тебе передали сверху, иначе код будет супер-связный (это плохо)
2. Когда ты пишеь по SOLID и выносишь в конструктор все эти зависимости которые тебе нужны, ты просто офигеешь в продакшене создавать такие классы руками, var a = new A(new B(new C()), new D(), new E()...
3. Код написанный по SOLID проще тестить, т.к. легко замокать все зависимости
4. Это дает некоторую гибкость например в настройке окружения для разных тенантов - ты можешь в одном месте в контейнере, подсовывать разные реализации
5. Чисто визуально, проще смотреть от чего код зависит, смотришь на конструктор и понимаешь что других зависимостей там нет
6. Контейнер может управлять процессом создания объектов - нужно ли всегда один и тот же возвращать или нужно каждый раз по новой создавать