ioc和依赖注入之间的区别

Par*_*rag 2 dependency-injection terminology

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

Nat*_*han 6

IoC表示控制反转.

让我们看一些"强耦合代码"("MyComponent"取决于"Logger"):

public class MyComponent
{
  public MyComponent()
  {
  :
  }
  public void DoSomeWork()
  {
    var logger = new Logger();
  :
  }
}
Run Code Online (Sandbox Code Playgroud)

我们可以将其更改为使用"界面",但有人必须提供"实现":

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

依赖注入(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();
   :
  }
}
Run Code Online (Sandbox Code Playgroud)

另一个实现是服务定位器.

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

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

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

您可以查看以下帖子:依赖性反转:服务定位器或依赖注入

也:

ASP.NET MVC:解析还是注入?那就是 Dino Esposito 的问题......

控制容器的反转和依赖注入模式由马丁福勒

由Martin Fowler开发的InversionOfControl