Введение
В программной инженерии внедрение зависимостей - это метод, с помощью которого один объект (или статический метод) предоставляет зависимости другого объекта. Зависимость - это объект, который можно использовать (услуга).Это определение из Википедии, но все же, но его не очень легко понять. Так что давайте лучше это разберемся.
Прежде чем понять, что это означает в программировании, давайте сначала посмотрим, что это означает в целом, поскольку это поможет нам лучше понять концепцию.
Зависимость или зависимость означает полагаться на что-то для поддержки. Например, если я говорю, что мы слишком полагаемся на мобильные телефоны, это означает, что мы зависим от них.
Итак, прежде чем переходить к инъекциям зависимостей , давайте сначала разберемся, что означает зависимость в программировании.
Когда класс A использует некоторую функциональность класса B, тогда говорится, что класс A имеет зависимость от класса B.

В Java, прежде чем мы сможем использовать методы других классов, нам сначала нужно создать объект этого класса (то есть класс A должен создать экземпляр класса B).
Итак, передача задачи создания объекта кому-то другому и прямое использование зависимости называется внедрением зависимости.

Почему я должен использовать внедрение зависимостей?
Допустим, у нас есть класс автомобилей, который содержит различные объекты, такие как колеса, двигатель и т. Д.
Здесь класс автомобиля отвечает за создание всех объектов зависимостей. А что, если мы решим отказаться от MRFWheels в будущем и захотим использовать Yokohama Wheels?
Нам нужно будет воссоздать объект car с новой зависимостью Yokohama. Но при использовании внедрения зависимостей (DI) мы можем изменять колеса во время выполнения (поскольку зависимости могут быть введены во время выполнения, а не во время компиляции).
Вы можете думать о DI как о посреднике в нашем коде, который выполняет всю работу по созданию объекта предпочтительных колес и предоставлению его классу Car.
Это делает наш класс Car независимым от создания объектов Wheels, Battery и т. Д.
В основном существует три типа внедрения зависимостей:
- Внедрение конструктора: зависимости предоставляются через конструктор класса.
- Внедрение установщика: клиент предоставляет метод установки, который инжектор использует для внедрения зависимости.
- внедрение интерфейса: зависимость предоставляет метод инжектора, который будет внедрять зависимость в любого переданного ей клиента. Клиенты должны реализовать интерфейс, который предоставляет метод установки, который принимает зависимость.
Итак, теперь ответственность за внедрение зависимостей состоит в следующем:
- Создать объекты
- Знайте, каким классам требуются эти объекты
- И предоставить им все эти предметы
Если есть какие-либо изменения в объектах, то DI изучает их, и это не должно касаться класса, использующего эти объекты. Таким образом, если объекты изменятся в будущем, его DI должен предоставить соответствующие объекты классу.
Инверсия управления - концепция DI
Это означает, что класс не должен настраивать свои зависимости статически, а должен настраиваться каким-то другим классом извне.
Это пятый принцип SOLID -пять основных принципов объектно-ориентированного программирования и дизайна от дяди Боба, в которых говорится, что класс должен зависеть от абстракции, а не от конкреций (проще говоря, жестко запрограммированных).
Согласно принципам, класс должен сосредоточиться на выполнении своих обязанностей, а не на создании объектов, необходимых для выполнения этих обязанностей. И здесь вступает в игру внедрение зависимостей : оно предоставляет классу требуемые объекты.
Примечание. Если вы хотите узнать о принципах SOLID от дяди Боба, перейдите по этой ссылке.
Преимущества использования DI
- Помогает в модульном тестировании.
- Код плиты котла сокращен, так как инициализация зависимостей выполняется компонентом инжектора.
- Расширять приложение становится проще.
- Помогает обеспечить слабую связь, что важно при программировании приложений.
Недостатки DI
- Это немного сложно для изучения, и при чрезмерном использовании могут возникнуть проблемы с управлением и другие проблемы.
- Многие ошибки времени компиляции переносятся во время выполнения.
- Фреймворки внедрения зависимостей реализуются с помощью отражения или динамического программирования. Это может затруднить использование таких средств автоматизации IDE, как «поиск ссылок», «отображение иерархии вызовов» и безопасный рефакторинг.
Вы можете реализовать внедрение зависимостей самостоятельно (Pure Vanilla) или использовать сторонние библиотеки или фреймворки.
Библиотеки и фреймворки, реализующие DI
- Весна (Java)
- Google Guice (Java)
- Кинжал (Java и Android)
- Замок Виндзор (.NET)
- Единство (.NET)
Чтобы узнать больше о внедрении зависимостей, вы можете ознакомиться со следующими ресурсами:
Внедрение зависимостей Java - Учебное пособие по образцу шаблона проектирования DI - JournalDev
Использование внедрения зависимостей в Java - Введение - Учебное пособие - Vogella
Инверсия управляющих контейнеров и шаблон внедрения зависимостей - Мартин Фаулер
Надеюсь, это поможет!
Если вам понравилась статья и вы хотите прочитать больше замечательных статей, подпишитесь на меня (Бхавья Кариа) и покажите свою поддержку, поскольку это побуждает меня писать больше.
Если у вас есть какие-либо вопросы или отзывы для меня, давайте подключимся к LinkedIn, Twitter, Facebook.
Изменить 1:
Благодаря Сергею Уфокодеру эта статья переведена на русский язык. Мои русские друзья, которые все умеют читать по-русски, действительно прочтут это.
Ссылка на статью
Кроме того, если вы хотите применить DI в JavaScript и ищете библиотеку, Джо Сурикат предлагает вам попробовать его библиотеку.
Ди-ниндзя
Еще одна замечательная библиотека DI на JavaScript была предложена Николасом Фроидуре.
нож
Изменить 2:
Если вы PHP-разработчик, не волнуйтесь, вы все тоже позаботитесь. Гордон Форсайт порекомендовал эту удивительную библиотеку, которую вы все, возможно, захотите попробовать.
аурин
Спасибо за все добрые слова, которые я получаю. Поделитесь статьей, чтобы пользу от нее могло получить больше и больше людей.
Если вы узнали хоть что-то, поделитесь, пожалуйста, этой историей!