Зачем нужны Dependency containers?
Что бы руками сервисы не инициализировать. Пишите свой компонет/сервис, в конструктор передаете реализацию интерфейса (то есть ваш класс зависит только от интерфейса) а контейнер в зависимости от настроек подсунет нужную реализацию.
Ваш класс при этом не завязан на конкретную реализацию, соблюдается принцип Dependency Inversion, легко покрыть тестами, и в любой момент времени в конфиге контейнера можно подменить реализацию не затрагивая при этом никакой другой код. Ну и меньше бойлерплейта.
Так же можно разграничивать доступ к различным слоям приложения что бы небыло соблазнов из одного слоя (например представления) дернуть что-то из слоя обработки запросами... ну или не знаю...
Так же есть варианты с коллекторами. То есть мы собираем все сервисы реализующие какой-то интерфейс (например драйвера) и регистрируем их в другом сервисе.
Что бы руками сервисы не инициализировать. Пишите свой компонет/сервис, в конструктор передаете реализацию интерфейса (то есть ваш класс зависит только от интерфейса) а контейнер в зависимости от настроек подсунет нужную реализацию.
Ваш класс при этом не завязан на конкретную реализацию, соблюдается принцип Dependency Inversion, легко покрыть тестами, и в любой момент времени в конфиге контейнера можно подменить реализацию не затрагивая при этом никакой другой код. Ну и меньше бойлерплейта.
Так же можно разграничивать доступ к различным слоям приложения что бы небыло соблазнов из одного слоя (например представления) дернуть что-то из слоя обработки запросами... ну или не знаю...
Так же есть варианты с коллекторами. То есть мы собираем все сервисы реализующие какой-то интерфейс (например драйвера) и регистрируем их в другом сервисе.