IoC容器Autofac(1) -- 什么是IoC以及理解为什么要使用Ioc
阅读目录:
一. 一个没有使用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相关推荐
- IoC容器Autofac(3) - 理解Autofac原理,我实现的部分Autofac功能(附源码)
上篇文章中,举了一个Autofac的简单例子,园友eflay反应: "虽然对autofac架构原理还是完全不懂,不过基本是明白ioc的用途了,会从已注册的类中找出符合接口的类来调用构造函数进 ...
- IoC容器Autofac(2) - 一个简单示例(附demo源码)
上篇文章中(IoC容器Autofac(1) -- 什么是IoC以及理解为什么要使用Ioc),我们用自己的方式实现了一个简陋的工厂类来实现IoC. 这里我们尝试使用Auotfac来替换我们的工厂类Mov ...
- IoC容器Autofac
一.一个没有使用IoC的例子 IoC的全称是Inversion of Control,中文叫控制反转.要理解控制反转,可以看看非控制反转的一个例子. public class MPGMovieList ...
- .net core2.0下Ioc容器Autofac使用
Autofac基本使用 Autofac是一款轻量级的IOC框架,使用率上还是挺高的,官方网站http://autofac.org,源码下载地址https://github.com/autofac/Au ...
- Ioc容器Autofac介绍
Autofac是轻量级的开源Ioc容器,在这里可以下载http://code.google.com/p/autofac/.如果你用过其他的Ioc容器,那么学习Autofac使用也会比较容易,下面将通过 ...
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
上一篇ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器) ,我们说过ASP.NET Core中自带的IOC容器是属于轻量级的,功能并不是很多,只是提供了基础 ...
- 深入理解DIP、IoC、DI以及IoC容器
对于大部分小菜来说,当听到大牛们高谈DIP.IoC.DI以及IoC容器等名词时,有没有瞬间石化的感觉?其实,这些"高大上"的名词,理解起来也并不是那么的难,关键在于入门.只要我们入 ...
- ASP.NET MVC IOC 之AutoFac攻略
转于:http://www.cnblogs.com/WeiGe/p/3871451.html 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用Aut ...
- IOC容器特性注入第一篇:程序集反射查找
学习kooboo的框架发现它的注入容器方法比较特别,同样是利用MVC的注入点,但它是查找网站下面bin所有的DLL利用反射查找特性找到对应的服务注入到容器. 这样的好处很简单:完全可以不用关心IOC容 ...
最新文章
- jQueryEasyUI 的入门
- 我的世界服务器菜单制作,小白腐竹福[服务器菜单制作]极其详细!看了就会
- 5.hadoop常用命令
- 复旦大学邱锡鹏教授团队:Transformer最新综述
- Asp.net 关于错误提示 类型“XXX1”在未被引用的程序集中定义,必须添加对程序集XXX2的引用...
- SM2 国密算法被 Linux 内核社区接受
- 通过JavaScript操作HTML中select标签
- mysql c api 函数 linux下 mysql_query_Linux C 调用MYSQL API 函数mysql_escape_string()转义插入数据...
- java将对象 缓存_ehcache java 对象缓存怎么实现
- Linux 命令之 tar 备份与解压缩
- 将时间戳转化为带时区的格式
- 这种文件别打开, 大小不足1KB, 却可以让你电脑瘫痪
- 柔性自动化生产线及工业机器人应用实训系统(八站)
- js 验证身份证格式
- 用户反馈驱动抖音产品体验优化实践
- 二氯甲烷废气处理吸附工艺
- ES term terms 查询
- 基于simulink的PN码伪码匹配的同步仿真,包括解调,伪码匹配,fft等模块
- 网络工程师课程---3、IP与路由器(ip地址的主要作用是什么)
- 整理100多个爱好|经验|能力进行副业赚钱平台
热门文章
- Category Archives: Linux
- asp.net 2.0防止同一用户同时登陆
- 轻量级简单队列服务HTTPSQS安装与使用
- Windows/Linux上使用fopen相关函数读取大文件
- 提高C++性能的编程技术笔记:引用计数+测试代码
- Go在Ubuntu 14.04 64位上的安装过程
- 【FFmpeg】详解FFmpeg解封装、解码流程
- OpenCV-Java版学习(1.在IDEA中使用OpenCV)
- java线程的优先级是数字越大优先级越高_《深入理解Java虚拟机》5分钟速成:12章(Java内存模型与线程)...
- 微信小程序如何进行登录授权和获取用户信息