关于设计模式:控制反转究竟是什么

What exactly is Inversion of Control

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is Inversion of Control?

我知道依赖注入(DI)是什么(我想!).基本上是满足对象可能具有的依赖关系。我试着想想当使用DI作为面向服务的时候我写的代码,我把我的代码定义为使用其他服务。

然而,我现在想知道,在使用IOC时,我们到底是在改变对什么的控制。这是一个相当模糊的术语,可能意味着一些事情。

但是,我认为创建由IOC框架处理的对象(并因此满足使用DI的依赖性)是有责任的。

应用程序仍然有责任要求它使用的对象(即服务),区别在于它不知道(或不关心)如何创建它。那么,为什么服务定位器被认为是反模式的,如果它所做的一切都是请求服务?

我说得对吗?或者是其他什么意思。另外,我是否正确地将DI和IOC的职责分开了?如果我有一个IOC框架,就不能在没有DI框架的情况下运行。或者DI只是IOC框架的一个特性?


依赖注入通常意味着将依赖对象作为参数传递给方法,而不是让方法创建依赖对象。它在实践中的含义是,方法不直接依赖于特定的实现;任何满足需求的实现都可以作为参数传递。

控制反转只认识到依赖关系是反转的。A不是通过创建、实现或直接调用B来依赖B,而是接收B作为参数,并且不再以任何方式对B负责。

将参数类型实现为接口简化了过程,并将其概括,但这并不是严格必要的。


控制反转是一种普遍的模式。依赖注入就是这种模式的一种用法。有关更多信息,本文由MartinFowler撰写,特别是标题为"控制反转"的部分。

现在很多人都避免使用DI的"控制反转"一词,因为反转与人们在依赖注入变得普遍之前所做的事情相比较。如果你现在已经习惯了依赖注入,或者是从一开始就有足够幸运地这么想的人之一,那么试图弄清楚被反转的是什么只是令人困惑。


控制反转基本上意味着应用程序代码不关心它需要的部分来自何处。

您可以通过各种类型的依赖注入来实现IOC。

与Java世界中的情况相反,包装器可能通过JNDI按名称请求资源。在这种情况下,代码要求它的需求,而不是提供它。

您说"应用程序仍然有责任要求它使用的对象(即服务),区别在于它不知道(或不关心)如何创建它。"

我不认为这是真的;组件不要求其他组件。依赖关系是从更高的层次注入的,这是一种不同的语义。这就是国际奥委会。