Dependency Injection (DI) не уменьшает связывание как таковое, потому что компонент, который полагается на зависимость, все еще связан с ее зависимостью. Однако, что DI делает , так это снять ответственность за поиск зависимости от самого компонента и передать эту ответственность в другом месте.
Компонент, который полагается на DI, является полностью пассивным, когда дело доходит до его зависимостей. В компоненте нет кода, который говорит «создайте новый экземпляр этой зависимости» или «выйдите и принесите мне эту зависимость». Зависимость предоставляется компоненту (внедренному в него), обычно, когда сам компонент создается каким-либо другим объектом.
Это изменение ответственности за создание (или запрос на создание) зависимости называется Inversion of Control (IoC).
Итак, если компонент не знает, как создать или запросить зависимость, где лежит эта ответственность? Обычно в объекте, созданном специально для разрешения зависимостей, обычно называемом контейнером IoC. По вашей аналогии, это ваш «сундук с сокровищами». Контейнер IoC содержит инструкции, которые в основном говорят: «когда кто-то запрашивает этот , дайте ему один из них . Контейнер IoC обычно может проверять компонент, который его просят создать, выяснить, что его зависимости, и их тоже, идут по «цепочке зависимостей», пока все зависимости не будут разрешены.
Большой сдвиг в мышлении, инъекция, происходит при принятии решения * кто будет спрашивать контейнер о зависимости компонента "? Без DI сам компонент будет запрашивать контейнер для его зависимости. Однако, используя DI ответственность за запрос контейнера «разрешить» зависимость компонента падает на то, что создает или использует компонента. Когда компонент создается, все, что его создает, несет ответственность за обеспечение все зависимости. Компонент не знает и не заботится о том, как они создаются, просто они есть.
Теперь, если зависимость определена как конкретная реализация, компонент все еще тесно связан с этой конкретной конкретной реализацией, даже если она внедряется. Сам DI не уменьшает сцепление в этом смысле. Но если зависимость определяется как интерфейс , компонент не заботится и не знает, что такое конкретная реализация или как она создается. Это все еще связано с зависимостью, но это очень слабая связь .
В этом смысле «Внедрение зависимостей» и «Программирование на интерфейсах» объединяются для создания очень слабо связанных, очень гибких компонентов.