Разница между ioc и инъекцией зависимостей - PullRequest
2 голосов
/ 04 августа 2010

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

Ответы [ 5 ]

6 голосов
/ 25 апреля 2012

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: разрешить или внедрить? Это проблема ... Дино Эспозито

Инверсия управляющих контейнеров и шаблон внедрения зависимостей . Автор Martin Fowler

InversionOfControl , автор Martin Fowler

4 голосов
/ 17 марта 2012

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

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

1 голос
/ 21 января 2012
1 голос
/ 04 августа 2010

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

CodeProject

IoC Container

Виндзорский контейнер

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

0 голосов
/ 29 декабря 2010

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

...