美文网首页
DIP,IOC,DI,IOC容器

DIP,IOC,DI,IOC容器

作者: 我不说你不懂_f0c6 | 来源:发表于2017-04-13 12:03 被阅读0次

依赖倒置原则(DIP):一种软件架构设计的原则(抽象概念)。

控制反转(IoC):一种反转流、依赖和接口的方式(DIP的具体实现方式)。

依赖注入(DI):IoC的一种实现方式,用来反转依赖(IoC的具体实现方式)。

IoC容器:依赖注入的框架,用来映射依赖,管理对象创建和生存周期(DI框架)。

相信大部分取过钱的朋友都深有感触,只要有一张卡,随便到哪一家银行的ATM都能取钱。在这个场景中,ATM相当于高层模块,而银行卡相当于低层模块。ATM定义了一个插口(接口),供所有的银行卡插入使用。也就是说,ATM不依赖于具体的哪种银行卡。它只需定义好银行卡的规格参数(接口),所有实现了这种规格参数的银行卡都能在ATM上使用。现实生活如此,软件开发更是如此。依赖倒置原则,它转换了依赖,高层模块不依赖于低层模块的实现,而低层模块依赖于高层模块定义的接口。通俗的讲,就是高层模块定义接口,低层模块负责实现。

依赖倒置原则(DIP):

高模块提供接口: 低模块负责实现 (高层模块不应依赖低层膜科技,两者应该依赖抽象,抽象不应依赖实现,实现应依赖抽象)

高层模块的类依赖于低层模块的接口。因此,低层模块需要考虑到所有的接口。如果有新的低层模块类出现时,高层模块需要修改代码,来实现新的低层模块的接口。这样,就破坏了开放封闭原则。

控制反转(IoC)

DIP是一种软件设计原则,它仅仅告诉你两个模块之间应该如何依赖,但是它并没有告诉如何做。IoC则是一种软件设计模式,它告诉你应该如何做,来解除相互依赖模块的耦合。控制反转(IoC),它为相互依赖的组件提供抽象,将依赖(低层模块)对象的获得交给第三方(系统)来控制即依赖对象不在被依赖模块的类中直接通过new来获取。在图1的例子我们可以看到,ATM它自身并没有插入具体的银行卡(工行卡、农行卡等等),而是将插卡工作交给人来控制,即我们来决定将插入什么样的银行卡来取钱。同样我们也通过软件开发过程中场景来加深理解。

做过电商网站的朋友都会面临这样一个问题:订单入库。假设系统设计初期,用的是SQL Server数据库。通常我们会定义一个SqlServerDal类,用于数据库的读写。

public class  SqlServerDal

{

public void Add()

{

Console.WriteLine("在数据库中添加一条订单!");

}

}

然后我们定义一个Order类,负责订单的逻辑处理。由于订单要入库,需要依赖于数据库的操作。因此在Order类中,我们需要定义SqlServerDal类的变量并初始化。

public class Order

{

privatereadonlySqlServerDal dal =newSqlServerDal();//添加一个私有变量保存数据库操作的对象

public void Add()

{

dal.Add();

}

}

最后,我们写一个控制台程序来检验成果。

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

namespaceDIPTest

{

class Program

{

static void Main(string[] args)

{

Order order =newOrder();

order.Add();

Console.Read();

}

}

}

输出结果:

OK,结果看起来挺不错的!正当你沾沾自喜的时候,这时BOSS过来了。“小刘啊,刚客户那边打电话过来说数据库要改成Access”,“对你来说,应当小CASE啦!”BOSS又补充道。带着自豪而又纠结的情绪,我们思考着修改代码的思路。

由于换成了Access数据库,SqlServerDal类肯定用不了了。因此,我们需要新定义一个AccessDal类,负责Access数据库的操作。

public class AccessDal

{

public void Add()

{

Console.WriteLine("在ACCESS数据库中添加一条记录!");

}

}

然后,再看Order类中的代码。由于,Order类中直接引用了SqlServerDal类的对象。所以还需要修改引用,换成AccessDal对象。

public class  Order{

private readonly AccessDal dal =new AccessDal();//添加一个私有变量保存数据库操作的对象

public void Add()

{

dal.Add();

}

}

输出结果:

费了九牛二虎之力,程序终于跑起来了!试想一下,如果下次客户要换成MySql数据库,那我们是不是还得重新修改代码?

显然,这不是一个良好的设计,组件之间高度耦合,可扩展性较差,它违背了DIP原则。高层模块Order类不应该依赖于低层模块SqlServerDal,AccessDal,两者应该依赖于抽象。那么我们是否可以通过IoC来优化代码呢?答案是肯定的。IoC有2种常见的实现方式:依赖注入和服务定位。其中,依赖注入使用最为广泛。下面我们将深入理解依赖注入(DI),并学会使用。

相关文章

  • Android自我提升二 揭秘IOC注入框架,轻松实现布局、属性

    基础知识讲解 什么是DIP、IOC、DI、IOC容器 IOC中最基本的技术就是“反射(Reflection)”编程...

  • DIP,IOC,DI,IOC容器

    依赖倒置原则(DIP):一种软件架构设计的原则(抽象概念)。 控制反转(IoC):一种反转流、依赖和接口的方式(D...

  • IOC/ DI/ DIP

    IoC是目的,DI是实现手段。ioc是指让生成类的方式由传统方式(new)反过来,既程序员不调用new,需要类的时...

  • spring 官网 ioc- 1

    spring ioc container 只是转载bean的容器, IoC , DI, DI的方式 throug...

  • Spring2-Spring IoC容器和bean

    Spring IoC容器和bean Spring IoC容器 IoC也称为依赖注入(DI),可以帮我们创建对象 管...

  • 关于依赖注入(typescript)

    一、概念:依赖注入(DI)、控制反转(IOC)、IOC容器 依赖注入(DI)和控制反转(IOC)基本是一个意思,因...

  • 核心技术-IoC容器

    1、IoC容器简介 控制反转IoC(Inversion of Control)又称依赖注入DI(dependenc...

  • spring学习文档

    Spring ---轻量级的DI/IOC与AOP的容器框架~ DI(依赖注入)/IOC(控制反转) 导包 【spr...

  • Spring入门

    1、Spring IOC容器和Bean简介 IOC也称为依赖注入(DI)。IOC是指: 对象通过构造函数参数、工厂...

  • 常见面试题-Spring IOC(2)

    1、什么是Spring IOC 容器? IOC称为控制反转,也有一种说法叫DI(依赖注入)。IOC也是spring...

网友评论

      本文标题:DIP,IOC,DI,IOC容器

      本文链接:https://www.haomeiwen.com/subject/qjlbattx.html