控制反转 < 依赖注入

22

我感觉控制反转(IoC)这个概念并不存在,或者更准确的说法是依赖注入(dependency injection)。这个想法有误吗?

为了自己明确IoC的定义,我一直在努力。在这个过程中,我学到了很多关于IoC容器和依赖注入的知识。

刚刚我从Martin Fowler的网站上读到了以下内容:

结果我认为我们需要一个更具体的名称来描述这个模式。控制反转是一个过于通用的术语,因此人们会感到困惑。因此,在与各种IoC倡导者进行了大量讨论后,我们最终确定了“依赖注入”这个名称。

在现代IoC领域中,依赖注入难道不只是实现IoC的一种方式吗?


了解依赖注入的概念和重要性,请参考 http://ganeshtiwaridotcomdotnp.blogspot.com/2011/05/understanding-dependency-injection-and.html,而有关Spring框架的Bean装配的完整示例,请参考http://ganeshtiwaridotcomdotnp.blogspot.com/2011/05/dependency-injection-with-java-spring.html。本文以简单易懂的方式进行描述... - gtiwari333
3个回答

44

如果您接受Fowler的定义,则控制反转是比DI广泛得多的术语,它涵盖了所有使用框架的情况,您可以将其插入到框架中,但框架仍处于控制之下。

例如,在.NET中,诸如ASP.NET或Windows Presentation Foundation之类的框架最终处于控制之下,但提供各种事件和接口,您可以使用这些来构建应用程序。其他平台也是如此。

依赖注入是IoC的一个专业化领域,尤其适用于管理依赖项。


谢谢,这确实澄清了问题。你知道哪里可以找到更多的IoC示例吗? - John Leidegren
实际上,在面向对象编程中,控制反转(IoC)无处不在(与依赖注入相对)。很难找到相反的例子。我只真正了解.NET平台,但你几乎可以在那里使用任何类型的子框架(如ASP.NET、Windows Forms、WCF等)作为IoC框架。只有控制台应用程序真正落在这个类别之外。 - Mark Seemann
这是Fowler的声明所保证的:“控制反转是一个过于通用的术语”。更具体地说,我想看到DP和IoC的例子。我真的很着迷于学习如何通过DP实现良好的IoC。 - John Leidegren
@Mark - 是的,笨拙的打字错误。我正在学习如何利用IoC和DI,代码示例肯定会有所帮助。 - John Leidegren
好的,如果您能够阅读C#实例,我正在撰写一本关于这个主题的书籍...http://www.manning.com/seemann/ - Mark Seemann

6

这是我和马克意见分歧的少数几点之一。在我的书中,控制反转原则就像这里所说的那样,因此我不会再赘述它。

依赖注入仅仅是组件通过将其依赖关系的创建外部化给外界的一个行为。

控制反转容器管理这些依赖关系(以及许多其他内容),使用依赖注入只是其中的一个实现细节。


4

是的,IoC意味着类本身不控制事物,而是从外部调用。依赖注入是实现这一点的方法。

依赖注入确实是一个更具体、更明确定义的术语,比控制反转更容易理解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接