ioc和依赖注入之间的区别

时间:2010-08-04 05:01:27

标签: dependency-injection terminology

ioc和依赖注入之间的区别。解释春天的依赖注入。什么是差异b / w JSF依赖注入和spring依赖注入..

5 个答案:

答案 0 :(得分:6)

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();
        :
    }
}

Martin Fowler表示:“使用服务定位器,应用程序类通过向定位器发送的消息明确地请求它。使用注入没有明确的请求,服务出现在应用程序类中 - 因此控制反转。“

另外:“服务定位器和依赖注入之间的选择不如将服务配置与应用程序中的服务使用分开的原则重要。 “

您可以查看此信息:Dependency Inversion: Service Locator or Dependency Injection

另外:

Dino Esposito的

ASP.NET MVC: Resolve or Inject? That’s the Issue…

Martin Fowler的

Inversion of Control Containers and the Dependency Injection pattern

Martin Fowler的

InversionOfControl

答案 1 :(得分:4)

术语依赖注入(DI)&控制反转(IoC)通常可互换地用于描述相同的设计模式(尽管并非所有人都同意这一点,并且有些人倾向于以稍微不同的方式应用它们)。该模式最初称为IoC,但Martin Fowler建议转向DI,因为所有框架都以某种方式反转控制,他希望更具体地说明控制的哪个方面被颠倒。

关于Dependency Injection的这篇文章提供了一篇概述,并参考了福勒的文章。它也不像Spring& amp;等特定技术那么具体。 PicoContainer,并提供有关该主题的其他一些有趣文章的链接。同意上面的海报,福勒的文章是关于这个主题的规范性阅读,并给出了很好的概述。

答案 2 :(得分:1)

IoC是一种设计模式,大多数IoC容器都使用依赖注入。有不同类型的依赖性,但最好阅读一些帮助我的文章;

CodeProject

IoC Container

Windsor Container

Beginner guide

答案 3 :(得分:1)

请参阅Mark Seemann的Dependency Injection in .NET

答案 4 :(得分:0)

你会发现最好的文章是Martin Fowler在http://martinfowler.com/articles/injection.html。关于JSF,本文http://java.dzone.com/articles/jsf-anti-patterns-and-pitfalls似乎表明不同之处在于JSF使用Setter Injection而不是Constructor Injection(通常是首选)。