定义

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构造注入的框架。

参考资料:百度百科依赖倒置原则 深入理解DIP、IoC、DI以及IoC容器 同时可以对比看 angularjs的依赖注入: 参考:http://blog.csdn.net/renfufei/article/details/19038123 优质内容筛选与推荐>>
1、我的新书出版了,有兴趣的人过来看看,捧个场啊。
2、WEBUS2.0 In Action - [源代码] - C#代码搜索器
3、MySQL之二进制日志
4、springboot jpa使用
5、我们都一样-----张杰


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号