2011-01-14 3 views
2

Можно создать дубликат:
What is dependency injection?Что такое инъекция зависимостей?

Im обучения asp.net MVC 3. Одна из новых функций, являющихся Dependency Injection. Может кто-нибудь сказать мне, что это? почему это полезно? и когда его использовать? Благодаря

+3

дубликат [Что такое инъекции зависимость?] (Http://stackoverflow.com/questions/ 130794/что-это-зависимость инъекции) – jfar

ответ

2

Вероятно, больше подходит для программистов, но первым узнать о Инверсия управления

http://en.wikipedia.org/wiki/Inversion_of_control

http://www.martinfowler.com/articles/injection.html

Идея заключается в том, что компонент не должен знать о том, как получить/создать его зависимости, он должен предоставить то, что ему нужно, чтобы выполнить свою работу.

6

Инъекция зависимостей - это процесс, при котором зависимости приводятся к потребляющему коду, а не к тому коду, который отвечает за создание экземпляров самих объектов. В примитивном примере у вас может быть класс, отвечающий за расчет счета за оказанные услуги. Вы его инициализируете и называете его методом «Рассчитать»:

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 вашего типа интерфейса и передачи их классу.

3

Фактически, здесь есть два вопроса. Существует «Что такое инъекция зависимостей?» и «Что нового в MVC 3, которое добавляет больше« Поддержка впрыскивания зависимостей? ».

Dependency Injection - это шаблон программирования, когда классы не определяют новые объекты других классов до их использования (например, Some Send Sender class, который должен регистрировать электронные письма в БД, не создавать новый экземпляр Logger), но запрашивать его чтобы быть обеспеченным, не зная даже, какой класс он может быть (используя интерфейс, скажем, ILogger в нашем случае). Логгер здесь был бы зависимым, и эта зависимость запрашивается/вводится многими способами, либо запрашивается как параметр конструктора зависимого класса (например, EmailSender), либо просто делает его свойством в классе «set» accessor, и т.д...

Есть несколько библиотек, называемых библиотеками инъекций зависимостей, или Inversion Of Control Container. Это библиотеки, в которых вы определяете, какие классы должны использоваться в действительности во время выполнения и какие другие конкретные значения должны использоваться, и предлагайте им создавать для вас объекты (например, создать экземпляр EmailSender), передавая им все зависимости, рекурсивно (так, если ILogger на самом деле является DBLogger, которому нужна строка подключения, он отправляет его и т. д.). примеры Виндзор, Ninject, Autofac, Microsoft Unity ...

Для образца кода и более яркого примера, увидеть это хорошее бесплатное видео с парня, который работал в команде ASP.NET MVC:
http://tekpub.com/view/concepts/1

ASP.NET MVC всегда разрешал фабричный класс, где вы можете переопределить способ создания класса контроллера (чтобы вы могли использовать библиотеку контейнеров DI для создания контроллера и его зависимостей, как если бы это был или класс EmailSender). Что было в ASP.NET MVC 3.0 было улучшение по сравнению с существующей функциональности и обеспечения более методов, как это так, что это легче сделать DI всему ASP.NET MVC

и

Проверьте их для глубоких деталей ...

Смежные вопросы