今天早上Team内部培训Enterprise Library 中的Unity, 还介绍了IOC & DI & Interception, 下面把这些概念做个梳理.
XXContainer
无论是Spring.Net还是EntLib(Enterprise Library的简称)都有一个叫做Container的东西, Spring.Net对应的接口是 IApplicationContext, Unity中的叫做IUnityContainer, 主要做对象的Mapping 任务.
IOC
IOC直译过来是”控制反转”,这句话应该理解为什么地方的控制被反转了?控制的是什么?
这里的控制指的应该是对象的实例化位置由程序内部的硬编码移动到了程序外部, 实例化的位置做了反向控制.
OjbectA a = new Objecta();
应用了IOC之后就变成了:
IObjectA a = Container.Resolve(“OjbectA”) as IObjectA;
可见这里元被直接new的对象,现在交给了Container来做, 让后根据Container中的Mapping 来决定用哪个实现来初始化.
DI
“依赖注入”的三种注入方法分别是Constructor Injection,Method Injection, Property Injection. 他是针对面向对象”依赖倒置(DIP)”原则的实现, 其意思是通类内部对外部组件的依赖可以有这三种方式来解除. 此模式也就是要要求当我们的类内部需要对外部组件引用的时候要使用对方的接口或者抽线方法,而不是具体实现类.
AOP
AOP, 面向切面编程,是一种编程方式, 百度文库的解释如下:
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。 LINK
主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。
主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改
变这些行为的时候不影响业务逻辑的代码。
Spring.Net AOP & EntLib Unity均实现了AOP的功能, 常见的方式都必须依赖于接口实现, 也有通过 MarshRefObject TransprentProxy, RealProxy来实现, 还有通过将方法设置为Virtual来实现.
记得还有一个种实现是在IL代码级别通过Proxy类似的模式实现.
Interception
Interception是EntLib Unity组件对AOP功能的一种实现,
总结
在我们的架构设计中引入IOC的目的就是为了解耦, 面向对象设计原则中有一个”依赖倒置”的原则, 那在这里的IOC框架(Unity, Spring.Net)刚好就是”依赖倒置”原则的一种实现,在这里我们依赖接口编程,在Container中mapping接口与其对应的实现类, 把依赖与实现的编程转移到了程序外部(在Container里配置).
最终, IOC, DI都是为了解耦而存活着.