阅读目录:

一. 一个没有使用IoC的例子

二. 当需求发生变动时,非IoC遭遇到的困境

三. 使用IoC彻底解决问题

四. 总结

一、一个没有使用IoC的例子

IoC的全称是Inversion of Control,中文叫控制反转。要理解控制反转,可以看看非控制反转的一个例子。

public class MPGMovieLister{public Movie[] GetMPG(){var finder = new ListMovieFinder();var allMovies = finder.FindAll();return allMovies.Where(m => m.Name.EndsWith(".MPG")).ToArray();}}public class ListMovieFinder{public List<Movie> FindAll(){return new List<Movie>{new Movie{Name = "Die Hard.wmv"},new Movie{Name = "My Name is John.MPG"}};}}

上面的例子中,类MPGMovieLister的作用是列出所有的mpg类型的电影,其中调用了类ListMovieFinder类的方法FindAll()来获取所有的电影。

这段代码看起来还不错,已经符合当前的需求了。

二、当需求发生变动时,非IoC遭遇到的困境

假如,这个时候,movie的列表获取不是直接创建一个list获取,而要求从某个文本文件读取,或者是数据库获取,又或者从web service中获取,我们怎么办?

第一步,再实现一个类, 比如FileMovieFinder,来实现从文本文件中读取Movie列表,再把MPGMovieLister中的这行代码,

var finder = new ListMovieFinder();
替换成

var finder = new FileMovieFinder();
那么这行代码就又能够符合要求了。

新的MPGMovieLister代码是这个样子:

   public class MPGMovieLister{public Movie[] GetMPG(){var finder = new FileMovieFinder();var allMovies = finder.FindAll();return allMovies.Where(m => m.Name.EndsWith(".MPG")).ToArray();}}

如果底层--获取数据的方式不确定,或者经常更改,MPGMovieLister的代码岂不是要频繁改动?

三、使用IoC彻底解决问题:

MPGMovieLister的功能都是依赖着具体的类,ListMovieFinder,FileMovieFinder。当需求发生变化的时候,就会导致MPGMovieLister的代码也要做相应的改动。

也就是说,MPGMovieLister直接依赖于ListMovieFinder和FileMovieFinder了。

跳出来看,MPGMovieLister的功能只是负责从列表中找出MPG的movie, 至于movie从什么地方来的,不是MPGMovieLister的职责,它也不需要关心。

而解耦合的方法就是”依赖于抽象,而不是依赖于具体”.

(这个例子非常类似于我们的做开发时候的持久层(数据层)和业务逻辑层,其实业务逻辑层也不关心数据是如何提供的,所以业务逻辑层也应当与持久层解耦合。)

实际解决之后的代码:

public class MPGMovieLister{public Movie[] GetMPG(){var finder = MovieFinderFactory.GetFinder();var allMovies = finder.FindAll();return allMovies.Where(m => m.Name.EndsWith(".MPG")).ToArray();}}public class MovieFinderFactory
{public static IMovieFinder GetFinder(){return new FileMovieFinder();}
} public interface IMovieFinder
{List<Movie> FindAll()
}

这里MPGMovieLister就依赖于IMovieFinder接口(依赖抽象), 实际运行时候的实例化由MovieFinderFactory来提供。这样,不同的Movie数据源只需要一个实现IMovieFinder 的类就可以了,不会对MPGMovieLister产生任何影响。

到这里,实际上已经完成了IoC, 控制权最初取决于MPGMovieLister中是如何实例化MovieFinder 的,现在它已经交出控制权,交由外部来提供具体实例对象了。

这里的MovieFinderFactory就已经是一个简陋的IoC容器功能了。

四、总结

IoC这种解决依赖的方法是面向对象方法的使用。现实世界中,这种方法无处不在。

比如,汽车不会强依赖于某个品牌的轮胎,任何公司生产的轮胎,只要符合汽车的接口,就可以装在这个汽车上使用。

还有电脑的USB接口,只要符合USB标准的外设,就都能够接上电脑使用。

解除依赖不仅让代码结构看起来更加合理,其带来的另一个好处是,各个部分可以单独的做单元测试,使得单元测试能够更加容易的进行。这个对于一些复杂度高的项目,对于保证项目的稳定性和可用性非常有意义。

真正的IoC容器比上面的MovieFinderFactory自然要好用和适用的多。下一篇文章将会介绍一个非常棒的IoC框架Autofac.

相关文章:

IoC容器Autofac(2) - 一个简单示例

IoC容器Autofac(3) - 理解Autofac原理,我实现的部分Autofac功能(附源码)

IoC容器Autofac(4) - Autofact + Asp.net MVC + EF Code First(附源码)

理解为什么要使用Ioc

分析Autofac如何实现Controller的Ioc(Inversion of Control)

转载于:https://www.cnblogs.com/JustRun1983/archive/2013/03/17/2965201.html

IoC容器Autofac(1) -- 什么是IoC以及理解为什么要使用Ioc相关推荐

  1. IoC容器Autofac(3) - 理解Autofac原理,我实现的部分Autofac功能(附源码)

    上篇文章中,举了一个Autofac的简单例子,园友eflay反应: "虽然对autofac架构原理还是完全不懂,不过基本是明白ioc的用途了,会从已注册的类中找出符合接口的类来调用构造函数进 ...

  2. IoC容器Autofac(2) - 一个简单示例(附demo源码)

    上篇文章中(IoC容器Autofac(1) -- 什么是IoC以及理解为什么要使用Ioc),我们用自己的方式实现了一个简陋的工厂类来实现IoC. 这里我们尝试使用Auotfac来替换我们的工厂类Mov ...

  3. IoC容器Autofac

    一.一个没有使用IoC的例子 IoC的全称是Inversion of Control,中文叫控制反转.要理解控制反转,可以看看非控制反转的一个例子. public class MPGMovieList ...

  4. .net core2.0下Ioc容器Autofac使用

    Autofac基本使用 Autofac是一款轻量级的IOC框架,使用率上还是挺高的,官方网站http://autofac.org,源码下载地址https://github.com/autofac/Au ...

  5. Ioc容器Autofac介绍

    Autofac是轻量级的开源Ioc容器,在这里可以下载http://code.google.com/p/autofac/.如果你用过其他的Ioc容器,那么学习Autofac使用也会比较容易,下面将通过 ...

  6. ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

    上一篇ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器) ,我们说过ASP.NET Core中自带的IOC容器是属于轻量级的,功能并不是很多,只是提供了基础 ...

  7. 深入理解DIP、IoC、DI以及IoC容器

    对于大部分小菜来说,当听到大牛们高谈DIP.IoC.DI以及IoC容器等名词时,有没有瞬间石化的感觉?其实,这些"高大上"的名词,理解起来也并不是那么的难,关键在于入门.只要我们入 ...

  8. ASP.NET MVC IOC 之AutoFac攻略

    转于:http://www.cnblogs.com/WeiGe/p/3871451.html 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用Aut ...

  9. IOC容器特性注入第一篇:程序集反射查找

    学习kooboo的框架发现它的注入容器方法比较特别,同样是利用MVC的注入点,但它是查找网站下面bin所有的DLL利用反射查找特性找到对应的服务注入到容器. 这样的好处很简单:完全可以不用关心IOC容 ...

最新文章

  1. jQueryEasyUI 的入门
  2. 我的世界服务器菜单制作,小白腐竹福[服务器菜单制作]极其详细!看了就会
  3. 5.hadoop常用命令
  4. 复旦大学邱锡鹏教授团队:Transformer最新综述
  5. Asp.net 关于错误提示 类型“XXX1”在未被引用的程序集中定义,必须添加对程序集XXX2的引用...
  6. SM2 国密算法被 Linux 内核社区接受
  7. 通过JavaScript操作HTML中select标签
  8. mysql c api 函数 linux下 mysql_query_Linux C 调用MYSQL API 函数mysql_escape_string()转义插入数据...
  9. java将对象 缓存_ehcache java 对象缓存怎么实现
  10. Linux 命令之 tar 备份与解压缩
  11. 将时间戳转化为带时区的格式
  12. 这种文件别打开, 大小不足1KB, 却可以让你电脑瘫痪
  13. 柔性自动化生产线及工业机器人应用实训系统(八站)
  14. js 验证身份证格式
  15. 用户反馈驱动抖音产品体验优化实践
  16. 二氯甲烷废气处理吸附工艺
  17. ES term terms 查询
  18. 基于simulink的PN码伪码匹配的同步仿真,包括解调,伪码匹配,fft等模块
  19. 网络工程师课程---3、IP与路由器(ip地址的主要作用是什么)
  20. 整理100多个爱好|经验|能力进行副业赚钱平台

热门文章

  1. Category Archives: Linux
  2. asp.net 2.0防止同一用户同时登陆
  3. 轻量级简单队列服务HTTPSQS安装与使用
  4. Windows/Linux上使用fopen相关函数读取大文件
  5. 提高C++性能的编程技术笔记:引用计数+测试代码
  6. Go在Ubuntu 14.04 64位上的安装过程
  7. 【FFmpeg】详解FFmpeg解封装、解码流程
  8. OpenCV-Java版学习(1.在IDEA中使用OpenCV)
  9. java线程的优先级是数字越大优先级越高_《深入理解Java虚拟机》5分钟速成:12章(Java内存模型与线程)...
  10. 微信小程序如何进行登录授权和获取用户信息