定义html
DIP(Dependence Inversion Principle):依赖(就是用到涉及到)倒置原则,高层模块(抽象层级较高,包括的范围较广,比较抽象)依赖底层模块的具体事物,底层发生变更的时候会牵连到高层,这是耦合很重的设计,破坏了开闭原则,而高层模块依赖抽象,底层模块一样依赖抽象(经过抽象在高低层之间通讯,没有直接的依赖,都依赖抽象,固然抽象自己应该要是稳定的)就会避免这样的问题,总结为第一条规则:高层模块不该该依赖低层模块,他们都应该依赖抽象。倒置一说就是避免人的惯性思惟带来的耦合重的缺点,让本来依赖具体的思惟方式改为依赖抽象,总结为第二条规则:抽象不依赖具体,而具体依赖抽象。angularjs
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构造注入的框架。url