Чтобы сделать это правильно, мы должны сначала определить зависимости и внедрение.
- Зависимость: любой ресурс, в котором нуждается операция.
- Инъекция: передача этого ресурса в операцию, как правило, в качестве аргумента метода.
Примитивным примером будет метод, который добавляет два значения. Очевидно, что этот метод нуждается в добавлении значений. Если они предоставляются путем передачи их в качестве аргументов, это уже будет случай внедрения зависимости. Альтернативой может быть реализация операндов в качестве свойств или глобальных переменных. Таким образом, никакие зависимости не будут внедрены, зависимости будут доступны извне заранее.
Предположим, вы используете вместо этого свойства и называете их A и B. Если вы измените имена на Op1 и Op2, вы нарушите метод Add. В противном случае ваша IDE обновит все имена для вас, суть в том, что метод также должен быть обновлен, поскольку он имеет зависимости от внешних ресурсов.
Этот пример является базовым, но вы можете представить более сложные примеры, когда метод выполняет операцию над объектом, таким как изображение, или когда он читает из потока файлов. Вы хотите, чтобы метод достиг изображения, требуя, чтобы он знал, где он находится? Нет. Вы хотите, чтобы метод открыл сам файл, требуя, чтобы он знал, где искать файл, или даже знал, что он будет читать из файла? Нет.
Дело в том, чтобы свести функциональность метода к его основному поведению и отделить метод от его среды. Вы получаете первое, выполняя второе, вы можете считать это определением внедрения зависимости.
Преимущества: так как зависимости для среды метода были устранены, изменения в методе не будут влиять на среду и наоборот. => Приложение становится проще в обслуживании (изменении).