Разница между ioc и внедрением зависимостей

Разница между ioc и внедрением зависимостей. объясните внедрение зависимостей весной. В чем разница между инъекцией зависимости b/w JSF и инъекцией зависимости spring..


person Parag    schedule 04.08.2010    source источник
comment
Пахнет домашним заданием, вопрос интервью также имеет требовательный тон   -  person naikus    schedule 04.08.2010


Ответы (5)


IoC означает инверсию управления.

Давайте посмотрим на некий «сильно связанный код» («MyComponent» зависит от «Logger»):

public class MyComponent
{
  public MyComponent()
  {
  :
  }
  public void DoSomeWork()
  {
    var logger = new Logger();
  :
  }
}

Мы можем изменить его, чтобы использовать «интерфейс», но кто-то должен предоставить «реализацию»:

public class MyComponent
{
  public MyComponent()
  {
  :
  }
  public void DoSomeWork()
  {
    ILogger logger = ...; // who’s going to provide this?
  :
  }
}

Внедрение зависимостей (DI) — это конкретная реализация IoC.

//Dependency Injection pattern
public class MyComponent
{
  private ILogger _logger;
  public MyComponent(ILogger logger)
  {
    _logger = logger;
  }
  public void DoSomeWork()
  {
    // Use the logger component here
    _logger.Log();
   :
  }
}

Другой реализацией является Service Locator.

//Service Locator pattern
public class MyComponent
{
    public MyComponent()
    {
        :
    }
    public void DoSomeWork()
    {
        ILogger logger = ServiceLocator.GetService();
        :
    }
}

Мартин Фаулер утверждает: «При использовании локатора службы класс приложения явно запрашивает его, отправляя сообщение локатору. При внедрении нет явного запроса, сервис появляется в классе приложения — отсюда и инверсия управления».

Также: «Выбор между Service Locator и Dependency Injection менее важен, чем принцип отделения конфигурации сервиса от использования сервисов внутри приложения. “

Вы можете проверить этот пост: Инверсия зависимостей: локатор службы или зависимость Инъекция

Также:

ASP.NET MVC: разрешить или внедрить? Вот в чем проблема… Дино Эспозито

Инверсия контейнеров управления и шаблон внедрения зависимостей, Мартин Фаулер

InversionOfControl Мартина Фаулера

person Nathan    schedule 25.04.2012

Термины «внедрение зависимостей» (DI) и «инверсия управления» (IoC) обычно используются взаимозаменяемо для описания одного и того же шаблона проектирования (хотя не все согласны с этим, и некоторые люди склонны применять их немного по-разному). Первоначально шаблон назывался IoC, но Мартин Фаулер предложил перейти на DI, потому что все фреймворки каким-то образом инвертируют управление, и он хотел уточнить, какой аспект управления инвертируется.

Эта статья о внедрении зависимостей содержит обзор и ссылается на статью Фаулера. Он также менее специфичен для конкретных технологий, таких как Spring и PicoContainer, и содержит ссылки на некоторые другие интересные статьи по этой теме. Согласитесь с приведенным выше плакатом, статья Фаулера является каноническим чтением по этому вопросу и также дает отличный обзор.

person Tyson    schedule 16.03.2012

IoC — это шаблон проектирования, и большинство контейнеров IoC используют внедрение зависимостей. Существуют разные типы внедрения зависимостей, но лучше всего прочитать несколько из этих статей, которые мне помогли;

CodeProject

Контейнер IoC

Контейнер Windsor

Руководство для начинающих

person Ryk    schedule 04.08.2010
comment
спасибо, но мне нужна разница между ч/б инъекцией зависимостей JSF и инъекцией зависимостей spring.. - person Parag; 06.08.2010

См. Внедрение зависимостей в .NET Марка Симанна.

person Contango    schedule 21.01.2012

Лучшая статья, которую вы найдете на эту тему, написана Мартином Фаулером по адресу http://martinfowler.com/articles/injection. HTML . Что касается JSF, эта статья http://java.dzone.com/articles/jsf-anti-patterns-and-pitfalls, по-видимому, указывает на то, что разница заключается в том, что JSF использует внедрение сеттера, а не внедрение конструктора (которое обычно предпочтительнее).

person smartcaveman    schedule 28.12.2010