定义
DIP(Dependence Inversion Principle):依赖(就是用到涉及到)倒置原则,高层模块(抽象层级较高,包括的范围较广,比较抽象)依赖底层模块的具体事物,底层发生变动的时候会牵连到高层,这是耦合很重的设计,破坏了开闭原则,而高层模块依赖抽象,底层模块同样依赖抽象(通过抽象在高低层之间通信,没有直接的依赖,都依赖抽象,当然抽象本身应该要是稳定的)就会避免这样的问题,总结为第一条规则:高层模块不应该依赖低层模块,他们都应该依赖抽象。倒置一说就是避免人的惯性思维带来的耦合重的缺点,让原本依赖具体的思维方式改成依赖抽象,总结为第二条规则:抽象不依赖具体,而具体依赖抽象。
IOC(Inversion of Control):控制反转,为两个相互依赖的组件提供抽象,将底层依赖的对象(来自高层)交给第三方系统来控制,引入了第三方控制系统,而不是普通的通过NEW的方式来获取对象。
DI(Denpdency Injection):依赖注入,将依赖对象的创建放到被依赖对象外部实现。把依赖关系包装到构造函数或者其他方法中,通过这种在外部提供内部依赖对象的方式,好像从外往里面注入了依赖对象。注入的方式有很多,构造函数,通过构造函数传参将依赖对象注入进去;属性注入,通过设置对象的属性来注入依赖对象;接口注入,提供一个具有注入依赖对象的方法契约的接口,被依赖的对象实现该接口,并且调用接口方法设置依赖对象。前面集中是手动方式设置依赖对象,通过IOC容器动态创建注入依赖对象,IOC容器有以下功能:动态创建、注入依赖对象;管理对象生命周期;映射依赖关系,如下:
public class FacadeFactory { public static T GetObject<T>() where T : IBaseFacade { IApplicationContext ctx = ContextRegistry.GetContext("Promocode.Facade"); return (T)ctx.GetObject(typeof(T).Name); } } //这是IOC容器 //这是抽象与具体的映射(依赖)关系 <object id="IMyCouponFacade" type="Payment.Promocode.Facade.MyCouponFacade, Payment.Promocode.Facade" /> <object id="IMyCouponBackManagerFacade" type="Payment.Promocode.Facade.MyCouponBackManagerFacade, Payment.Promocode.Facade" />
区别与联系
DIP是软件设计原则,告诉我们的是对错,不是具体如何做,IOC是设计模式,是软件开发中总结出来的可重用的解决方案,可以解决一些实际问题。DI是IOC的具体实现方式之一,IOC容器是DI构造注入的框架。