Зачем нужны Dependency containers?

Много читал да выглядывал, но всё никак не доходит. Кто может по-человечески объяснить зачем это нужно и в каких случаях обязательно использовать даный подход?
  • Вопрос задан
  • 3357 просмотров
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Что бы руками сервисы не инициализировать. Пишите свой компонет/сервис, в конструктор передаете реализацию интерфейса (то есть ваш класс зависит только от интерфейса) а контейнер в зависимости от настроек подсунет нужную реализацию.

Ваш класс при этом не завязан на конкретную реализацию, соблюдается принцип Dependency Inversion, легко покрыть тестами, и в любой момент времени в конфиге контейнера можно подменить реализацию не затрагивая при этом никакой другой код. Ну и меньше бойлерплейта.

Так же можно разграничивать доступ к различным слоям приложения что бы небыло соблазнов из одного слоя (например представления) дернуть что-то из слоя обработки запросами... ну или не знаю...

Так же есть варианты с коллекторами. То есть мы собираем все сервисы реализующие какой-то интерфейс (например драйвера) и регистрируем их в другом сервисе.
Ответ написан
Комментировать
FirstX
@FirstX
.net developer
Для того, чтобы отделить мух от котлет.

Представь, что у тебя условно есть 3 отдела. И все они между собой очень тесно связаны. Ну не могут работать друг без друга и все тут. В итоге захотел поменять что-то во втором отделе, будь добр поменяй и в остальных двух, ибо они от него напрямую зависят.

Первое, что приходит в голову - создание абстрактных интерфейсов, через которые все взаимодействие и происходит. Ок, создали. Но абстрактные интерфейсы делать ничего не могут, на то они абстрактные. Значит где-то нужно явно создавать реализацию для этой абстракции. Становится вопрос где это делать. Создавать внутри одного класса - экземпляры другого, это уже тоже сильная связанность между ними. Для этого и придумали ящик, где будут храниться все соответствия между интерфейсами и реализациями. Захотел получить реализацию такого-то интерфейса, попросил ответственного менеджера, он сам заглянул в свой ящик и вытащил то, что тебе требуется. И назвали это все Контейнер Зависимостей (Dependency Container). То есть это конкретный инструмент для создания слабых связей между модулями.

Ну а слабая связанность модулей и абстракции между ними дают всякие полезные фишки по типу быстрого переключения между реализациями (например реальное/тестовое окружение), позволяет проще рефакторить отдельные модули и так далее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы