Инъекция зависимостей - это процесс, при котором зависимости приводятся к потребляющему коду, а не к тому коду, который отвечает за создание экземпляров самих объектов. В примитивном примере у вас может быть класс, отвечающий за расчет счета за оказанные услуги. Вы его инициализируете и называете его методом «Рассчитать»:
public class InvoiceBiller
{
public void Bill()
{
Calculator calculator = new Calculator();
var totalAmountDue = calculator.CalculateBill(hoursWorked);
}
}
Этот метод зависит от класса калькулятора. Это нормально, это работает. Однако инъекции depenedency бы вы «впрыснуть» зависимость калькулятор:
public class InvoiceBiller
{
private readonly Calculator calculator;
public InvoiceBiller(Calculator calculator)
{
this.calculator = calculator;
}
public void Bill()
{
var totalAmountDue = calculator.CalculateBill(hoursWorked);
}
}
Как вы можете видеть, как во втором примере класс InvoiceBiller дается объект Calculator через конструктор (форма инъекции зависимостей называется инъекции конструктора). InvoiceBiller больше не заботится о том, как получить экземпляр биллера, ему просто дается одно.
Это помогает в тестировании. Вы можете пройти в любом экземпляре калькулятора, который вы хотите получить от своих тестов. Во время выполнения реального продукта вы можете передать калькулятор, который подключен к базе данных и просматривает почасовые ставки. Для тестирования вы проходите калькулятор, который использует жестко закодированные ставки, чтобы ваши тесты не нуждались в попадании в базу данных.
Принимая это шаг вперед, вы обычно проходят в интерфейс вместо конкретного типа:
public class InvoiceBiller
{
private readonly ICalculator calculator;
public InvoiceBiller(ICalculator calculator)
Теперь вы программируете против интерфейсов не реализации. Снова из ваших тестов вы можете использовать насмешливые фреймворки для создания mocks вашего типа интерфейса и передачи их классу.
дубликат [Что такое инъекции зависимость?] (Http://stackoverflow.com/questions/ 130794/что-это-зависимость инъекции) – jfar