控制反转(IoC / 依赖注入)入门指南

7

可能重复:
什么是控制反转?

嗯,我是新来的,看到人们真的很愿意帮助别人,所以我想借此机会问一个问题,如果您不介意的话。

那么,我已经读了很多,我发誓,但是,我似乎就是想不明白。 什么是控制反转(IoC或依赖注入)?为什么ASP.NET MVC +存储库模式项目这么多使用它?最后,当他们说“容器”时,他们意味着什么?“注入我的控制器”是什么意思?

我知道这可能是个老话题(甚至是个愚蠢的问题),但我似乎得不到任何白痴式的答案。


7
什么是控制反转 (Inversion of Control,IoC)?控制反转是一种设计模式,它将程序的控制权从调用代码中移除,并委托给一个外部框架或容器。在传统的程序设计中,应用程序通常通过直接实例化依赖对象来控制其行为,但在控制反转中,这些依赖关系被反转,即由框架或容器来创建和管理对象之间的关系。通过控制反转,应用程序变得更加灵活和可扩展,因为它们不再需要与特定实现直接耦合,而是可以轻松地切换或替换底层组件。这也有助于提高代码的可测试性和可维护性,因为依赖关系变得明确且易于管理。 - Tyler Treat
1
谢谢,StackOverflow是一个非常大的地方。 - Luis Aguilar
2个回答

6
将依赖注入/控制反转视为一个大型对象工厂,一个声明性的、配置驱动的虚拟构造函数。现在,您不再需要在代码中散布调用“new”的痕迹,这些调用硬编码了客户类所使用的具体类型,而是让虚拟构造函数为您实例化对象。
那么所有这些复杂性带来的优势是什么呢?
现在,对象创建是一种声明性的事情。如果您恰好基于适当的接口设计,可以在方便的时候要求对象工厂创建实现相同接口的代理。现在,各种好东西都变得可能:面向方面的编程、透明远程处理、声明性事务等。

2
谢谢,我期待学习这个模式。看起来非常有用。 - Luis Aguilar

4
简单回答:它让你把任何给定对象用于完成其工作的“东西”提交给它。
牵强的例子:假设对象想要获取某个目的的时间,您将其交给一个“ITimeService”,并在其中调用“GetTime”。
这样做的目的是“解耦”类与您可能不希望的关系,并有助于测试。
在我看来,有些人有点过度,但测试论点是有效的,当然,在某些时候采用这种方法是有用的。
更详细的答案:Martin Fowler on Inversion of Control

1
@Diego: 我没有特别地看到你所指的东西,但是从应用一般原则来看,这意味着将仓库(即获取数据的地方)传递给所有需要它的类;因此您可以在测试仓库、文本文件仓库或其他类型的仓库之间进行切换。 - Noon Silk
2
我同意 - 我已经使用 .Net 进行编程超过 13 年,我创建了从简单网站到非常复杂的门户网站的任何东西。我只遇到过少数几次需要使用 DI 的情况。通常有更简单的方法来完成它。 - Losbear
1
@NoonSilk,那么如果我有一个IBalloon对象..我可以传递("pink", "elephant")给对象,然后我将会得到一个粉色大象气球?就是这样? - JoJo

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