当前位置: 首页 > 编程日记 > 正文

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

相关文章:

【直播预告】7月18日3D游戏引擎免费公开课答疑,參与送C币!

喜讯喜讯&#xff01;为了酬谢广大学员。CSDN学院特推出iOS和3D游戏引擎开发免费技术答疑公开课&#xff0c;让您度过一个充实的暑假~ 參与本次公开课&#xff0c;即有机会获得50C币&#xff01; 答疑公开课时间&#xff1a;7月18日 晚7:30-9:30 答疑主题&#xff1a;姜雪伟3D…

Linux0.11内核引导启动过程概述

Linux0.11仅支持x86架构。它的内核引导启动程序在文件夹boot内&#xff0c;共有三个汇编代码文件。按照启动流程依次是&#xff1a; &#xff08;1&#xff09;bootsect.s。boot是启动引导的意思&#xff0c;sect即sector&#xff0c;是扇区的意思&#xff0c;二者合在一起启动…

用Python分析5000+抖音大V,粉丝最喜欢的视频类型是它

作者 | 小F来源 | 法纳斯特头图 | CSDN下载自视觉中国最近&#xff0c;小F在知乎上看到一个关于抖音的问题。里面提到了&#xff0c;目前我国人均每天刷短视频110分钟。看这数据&#xff0c;看来小F又被平均了。不过老实说&#xff0c;只要一打开抖音&#xff0c;小F确实是有一…

JSTL 读取数组 和 字符串连接

2019独角兽企业重金招聘Python工程师标准>>> JSTL读取数组&#xff1a; 从后台取得一个字符串&#xff0c;如&#xff1a;AA-50-3&#xff0c;通过-划分成字符串数组。然后读取每个字符串。 <c:set var"cle" value"${fn:split(AA-50-3,-)}"…

《Photoshop Lab修色圣典(修订版)》—第1课1.7节言归正传

本节书摘来自异步社区《Photoshop Lab修色圣典(修订版)》一书中的第1课1.7节言归正传&#xff0c;作者【美】Dan Margulis,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.7 言归正传Photoshop Lab修色圣典(修订版)上面的讨论说明&#xff0c;与其他方法相比&#x…

PHP获取当前时间差8小时的问题

<?php echo date("Y-m-d H:i:s"); //当前时间 ?> 这个方法获取的时间和标准时间差8小时&#xff1b;从php5.1.0开始&#xff0c;php.ini里加入了date.timezone这个选项&#xff0c;默认情况下是关闭的也就是显示的时间&#xff08;无论用什么php命令…

四连通,和八连通的详解(MATLAB)

转至&#xff1a;http://www.cnblogs.com/xiaojidan/archive/2012/08/20/2647261.html 功能&#xff1a;标注二进制图像中已连接的部分。语法&#xff1a;L bwlabel(BW,n) [L,num] bwlabel(BW,n) 其中BW为输入图像;N可取值为4或8表示连接四连通或八连通区域;NUM为找到的连通…

梅花桩上练真功,腾讯公布机器人移动技术探索新突破

出品 | AI科技大本营11月20日&#xff0c;腾讯公布了其在移动机器人研究方面的新进展&#xff1a;四足移动机器人 Jamoca 和自平衡轮式移动机器人首次对外亮相。Jamoca 是国内首个能完成走梅花桩复杂挑战的四足机器人&#xff0c;自平衡轮式移动机器人的相关研究成果还入选了机…

《Redis入门指南(第2版)》一第2章 准备

本节书摘来异步社区《Redis入门指南&#xff08;第2版&#xff09;》一书中的第2章&#xff0c;作者&#xff1a; 李子骅 责编&#xff1a; 杨海玲&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 第2章 准备 Redis入门指南&#xff08;第2版&#xff09;“…

深度学习中的注意力机制(二)

作者 | 蘑菇先生 来源 | NewBeeNLP目前深度学习中热点之一就是注意力机制&#xff08;Attention Mechanisms&#xff09;。Attention源于人类视觉系统&#xff0c;当人类观察外界事物的时候&#xff0c;一般不会把事物当成一个整体去看&#xff0c;往往倾向于根据需要选择性的去…

DataGrid列操作

DataTable检测是否存在某个DataColumn 1.if (dt.Columns.Contains("aa") true){ //存在aa} 2.foreach(DataColumn mDCol in dt.Columns) { if(mDCol.ColumnName"aa") { //存在aa } } 怎么样移除DataGrid列private void OnDataBound(object send…

【★更新★】高性能 Windows Socket 服务端与客户端组件(HP-Socket v2.0.1 源代码及测试用例下载)...

HP-Socket 以前为某大型通信项目开发了一套通用 Windows Socket TCP 底层通信组件&#xff0c;组件代号为 HP-Socket。现在把 HP-Socket 的所有代码向大众公开&#xff0c;希望能对大家有所帮助&#xff1b;另外&#xff0c;为了让大家能更方便的学习 HP-Socket&#xff0c;因此…

【数据库优化专题】MySQL视图优化(一)

本期数据库优化专题分享&#xff0c;为大家带来的是DBA社群MySQL领域原创专家——李海翔所著的MySQL视图优化系列文章。以下是第一部分的内容&#xff0c;未完部分敬请关注后续更新。 专家简介 李海翔 网名&#xff1a;那海蓝蓝 DBA社群MySQL领域原创专家 从事数据库研发、数…

使用Repeater的Template

.NET FX提供了一个方法,就是使用Template来在程序运行时对Repeater的显示进行控制. 这里我就不多说了,可以去看MSDN中的相关资料.(嘿嘿,其实我也没搞多少 )..其实主要是private void lc_DataBinding(object sender, EventArgs e)函数,在DataSource中的数据进行Bind的时候,每Bin…

获取文件最后修改时间的VC代码

作者&#xff1a;朱金灿来源&#xff1a;http://blog.csdn.net/clever101很多时候我们需要知道系统是什么时候编译生成的。我想到的一个直接的思路的是获取exe文件的最后修改时间。下面的一段代码可以做到这一点&#xff1a;CWinApp* pApp AfxGetApp();std::string strAppName…

BAT新风向标:程序员有福利了!

人工智能已成为新时代的风向标&#xff0c;如果你是对人工智能感兴趣的互联网工作者、大学生、研究生并期望在 AI 方向发展&#xff0c;建议你一定要深入学习一下人工智能。因为&#xff0c;未来将是人工智能的时代&#xff01;为什么会有这个判断呢&#xff1f;第一&#xff0…

《C++代码设计与重用》——1.2 重用的神话

本节书摘来自异步社区出版社《Imperfect C中文版》一书中的第1章&#xff0c;第1.2节&#xff0c;作者&#xff1a; 【美】Martin D.Carroll , Margaret A.Ellis&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.2 重用的神话 C代码设计与重用1.2 重用的神…

控件的呈现方法(Rendering)的内核

Asp.net中所有的控件都是从System.Web.UI.Control类,在control类中定义了三个与呈现有关的方法,分别是Render方法,RenderChildren方法和RenderControl方法.其中RenderControl方法是public的方法,先看看这三个方法的实现: Public void RenderControl(HtmlTextWriter writer) {//…

清华、北大教授同台激辩:脑科学是否真的能启发AI?

作者 | 高卫华出品 | AI科技大本营头图 | CSDN下载自视觉中国广义的智能科学是研究智能背后的科学&#xff0c;需要不断扩展科学研究范围&#xff0c;没有最后的疆域。但脑在几千年内的进化中都相对静止&#xff0c;因此脑科学是“自然科学最后的疆域”。脑科学是一个重要的研究…

CentOS 5 升级mysql5.1启动服务时报错

CentOS 5 升级mysql5.1启动服务时报错&#xff1a; [ERROR] Error message file /usr/share/mysql/english/errmsg.sys had only 481 error messages, but it should contain at least 641 error messages.解决方法是&#xff1a;1.mv /usr/share/mysql/english/errmsg.sys /us…

《JavaScript设计模式》——11.2 一切只因跨域

本节书摘来自异步社区《JavaScript设计模式》一书中的第11章&#xff0c;第11.2节&#xff0c;作者&#xff1a;张容铭著&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 11.2 一切只因跨域 “哦&#xff0c;为什么会出现&#xff0c;什么是跨域&#xff1f;…

程序员:我不学Python了!!

总学不会Python的原因&#xff0c;归根结底只有一个——学习方法不对。 作为一个唯一将易用性与功能取得平衡的编程语言&#xff0c;无论是编程新手还是多年经验的BATJZ技术大牛&#xff0c;都无可否认如今Python对于一个程序员职业发展的重要性。 所以&#xff0c;你现在能在网…

Javascript Tip(1) 操作剪贴板

javascript可以轻松操作客户端剪贴板内容&#xff0c;不过只适用IE5以上浏览器 javascript可以使用window.clipboardData对象处理剪贴板内容 保存到剪贴板的方法 setData(param1, param2) param1 :数据类型 text 或 URL等. param2 :数据内容 从剪贴板读出数据的方法 getdata(p…

MySQL 自增ID

http://hi.baidu.com/517898291/item/9cac18066030cac6905718e0 http://jiangshuiy.iteye.com/blog/751060 Sina 转载&#xff1a; MySQL: Get next AUTO_INCREMENT value from/for table Note to self: To get the next auto_increment value from a table run this query: SE…

《算法基础:打开算法之门》一1.5 拓展阅读

本节书摘来自华章出版社《算法基础&#xff1a;打开算法之门》一书中的第1章&#xff0c;第1.5节&#xff0c;作者 &#xff3b;美&#xff3d;托马斯 H 科尔曼&#xff08;Thomas H Cormen&#xff09;&#xff0c;更多章节内容可以访问云栖社区“华章计算机”公众号查看 1.…

Python画出心目中的自己

作者 | 李秋键责编 | 晋兆雨头图 | CSDN下载自视觉中国引言&#xff1a;人脸图像的生成在各个行业有着重要应用&#xff0c;例如刑事调查、人物设计、教育培训等。然而一幅逼真的人脸肖像&#xff0c;对于职业画家也要至少数小时才能绘制出来&#xff1b;对于从未接触过绘画的新…

认识 PHP 的hash函数

Hashing function (散列函式) 在网页应用中被广泛采用&#xff0c;从数码签署、错误检测、登入验证、到压缩储存空间&#xff0c;由于它的原理比较复杂&#xff0c;很多人把它跟加密函式混淆&#xff0c;对于如何运用hash function&#xff0c;如何选择合适的hash function&…

const在函数前与函数后的区别 [转]

[转] http://blog.csdn.net/clozxy/article/details/5679887 一 const基础 如果const关键字不涉及到指针&#xff0c;我们很好理解&#xff0c;下面是涉及到指针的情况&#xff1a; int b 500; const int* a &b; [1] int const …

《HTML5游戏编程核心技术与实战》——2.8 小结

本节书摘来自异步社区《HTML5游戏编程核心技术与实战》一书中的第2章&#xff0c;第2.8节,作者&#xff1a; 向峰 更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.8 小结 本章介绍了canvas的一些常用的操作&#xff0c;作为HTML5的最重要的特性&#xff0c;canvas使得…

IANA保留地址

IANA 就是指(Internet Assigned Numbers Authority) &#xff0c;Internet号分配机构。负责对IP地址分配规划以及对TCP/UDP公共服务的端口定义。国际互联网代理成员管理局&#xff08;IANA&#xff09;是在国际互联网中使用的IP 地址、域名和许多其它参数的管理机构。IP地址、自…