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 pattern
public class MyComponent
{
public MyComponent()
{
:
}
public void DoSomeWork()
{
ILogger logger = ServiceLocator.GetService();
:
}
}
Martin Fowler 指出:“使用服务定位器,应用程序类通过向定位器发送消息来明确请求它。通过注入,没有明确的请求,服务出现在应用程序类中——因此控制反转。”
另外:“服务定位器和依赖注入之间的选择不如将服务配置与应用程序中服务的使用分开的原则重要。 “
你可以看看这个帖子:依赖倒置:服务定位器或依赖注入 http://jhonatantirado.wordpress.com/2012/04/24/dependency-inversion-service-locator-or-dependency-injection/
Also:
ASP.NET MVC:解析还是注入?这就是问题所在…… http://www.simple-talk.com/dotnet/.net-framework/asp.net-mvc-resolve-or-inject-that%E2%80%99s-the-issue%E2%80%A6/通过迪诺·埃斯波西托
控制容器反转和依赖注入模式 http://martinfowler.com/articles/injection.html马丁·福勒
控制反转 http://martinfowler.com/bliki/InversionOfControl.html马丁·福勒