背景知识
控制反转
反转传统的控制逻辑,常见的传统控制逻辑有:
一、客户类型负责创建依赖。反转后的结构是:由IOC负责创建。
二、客户类型调用框架。反转后的结果是:框架调用客户类型。
依赖注入
客户类型需要显式的声明其依赖,不要在客户类型中管理依赖的创建。
IOC
中文可以翻译为:控制反转容器或依赖注入容器。
参考资料
Inversion of Control Containers and the Dependency Injection pattern
.NET:在ASPX、ASHX和MVC中使用IOC容器(菜鸟必看)
为什么要使用IOC容器?
从对象的角度思考什么系统
系统是由一张对象图组合而成,这些对象通过彼此之间的协作(发送消息)来完成需求。概括如下:
系统 = 对象图
基于类的语言如何表示系统
毫无疑问,在基于类的语言中:系统 = 类型定义 + 对象图(如何实例化)
考虑一个三层架构中的类图
如何创建这个类图的对象图?
简单的来说,我们有两种思路:
一、客户类型负责new依赖类型。这样做的结果是:
- 类图就是对象图,编译时绑定。
- 需要手工管理依赖的生命周期。
- 很难做单元测试。
- 很难升级和维护,比如:引入了一个新的子类,你要到处修改new的代码。
二、采用IOC容器new依赖类型。这样做的结果是:
- 类图不一定是对象图,运行时绑定。
- IOC容器挂自动管理的生命周期。
- 容易做单元测试。
- 容易升级和维护。
备注
有人说IOC的注册太麻烦,比new还麻烦,针对这个问题的思路是:“根据约定自动注册”,我就采用这种方式。