.NET中 MEF应用于IOC
IOC解释
- IOC,控制反转的意思。
所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B。所谓反转,你必须理解如果不反转,会怎么着,因为A必须要有B,才可以调用B,如果不反转,意思就是A主动获取B的实例:B b = new B(),这是获取获取B实例的方法,然后你就可以调用b对象了。
所以,不反转,意味着A要主动获取B,才能使用B;到了这里,你就应该明白了反转的意思了。倒置就是A要调用B的话,A并不需要主动获取B,而是由其它人自动将B送上门来。
.net中可用的IOC容器非常多,如 CastleWindsor,Unity,Autofac,ObjectBuilder,StructureMap,Spring.Net等,这些第三方工具各不相同,但功能大体都相同,大都需要事先对接口与实现进行配对(通过代码或配置文件),然后由系统自动或手动来通过接口来获得相应实现类的实例,对象实例化的工作由IOC容器自动完成。
MEF优势
- 自VS2010 自带:MEF的功能在 System.ComponentModel.Composition.dll 程序集中,直接引用即可使用,不用安装第三方组件
- 配置:MEF是不需要使用配置文件或代码对接口与实现进行一一配对的,只需要简单的使用几个Attribute特性,就能自动完成源与目标的配对工作
- 自动化:系统初始化时自动遍历程序目录或指定文件夹下的dll,根据程序集中接口与类的特定Attribute特性进行自动配对。
- 在逻辑层中,使用 Export特性 标记与它匹配的接口;
- 在Conronl中,使用 Import 来给接口注入实现类的实例
IOC组件注册
1.MefDependencySolver实现代码如下:
- /// <summary>
- /// MEF依赖关系解析类
- /// </summary>
- public class MefDependencySolver : System.Web.Mvc.IDependencyResolver, System.Web.Http.Dependencies.IDependencyResolver
- {
- private readonly ComposablePartCatalog _catalog;
- private const string MefContainerKey = "MefContainerKey";
- public MefDependencySolver(ComposablePartCatalog catalog)
- {
- _catalog = catalog;
- }
- public IDependencyScope BeginScope()
- {
- return this;
- }
- public void Dispose()
- {
- }
- public CompositionContainer Container
- {
- get
- {
- if (!HttpContext.Current.Items.Contains(MefContainerKey))
- {
- HttpContext.Current.Items.Add(MefContainerKey, new CompositionContainer(_catalog));
- }
- CompositionContainer container = (CompositionContainer)HttpContext.Current.Items[MefContainerKey];
- HttpContext.Current.Application["Container"] = container;
- return container;
- }
- }
- #region IDependencyResolver Members
- public object GetService(Type serviceType)
- {
- string contractName = AttributedModelServices.GetContractName(serviceType);
- return Container.GetExportedValueOrDefault<object>(contractName);
- }
- public IEnumerable<object> GetServices(Type serviceType)
- {
- return Container.GetExportedValues<object>(serviceType.FullName);
- }
- #endregion
- }
2.Global中初始化MEF容器
- //设置MEF依赖注入容器
- DirectoryCatalog catalog = new DirectoryCatalog(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath);
- MefDependencySolver solver = new MefDependencySolver(catalog);
- //MVC依赖注入
- DependencyResolver.SetResolver(solver);
源码:http://files.cnblogs.com/AntonWang/MEF%E5%BA%94%E7%94%A8%E4%BA%8EIOC.7z
.NET中 MEF应用于IOC的更多相关文章
- 20155301-滕树晨 第二次随笔作业--从现有技能获取的经验应用于JAVA中
第二次随笔--从现有技能获取的经验应用于JAVA中 你有什么技能比大多人(超过90%以上)更好? 这个想了半天,有一个是我乒乓球还是比较擅长的,在学校里可能比百分之90的人要强,在外面肯定是不如了.再 ...
- @Required 注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出一个 BeanInitializationException 异常。
@Required 注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出一个 BeanInitializationEx ...
- 应用于Java中的一个开源的表达式语言(Expression Language)
OGNL(英文全称:Object Graph Navigation Language,中文名:对象导航图语言)是应用于Java中的一个开源的表达式语言(Expression Language),它被集 ...
- 领域驱动和MVVM应用于UWP开发的一些思考
领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...
- Git应用于Android项目的入门知识:我的理解
Git应用于Android项目的基本知识. 常常将git,repo和gerrit三种工具配合起来使用,使Android开发中的部分工作自动化.并适应敏捷项目管理的需要. repo是Go ...
- thiscall仅仅应用于“C++”成员函数(this指针存放于CX寄存器,参数从右到左压)
_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈.VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上" ...
- JavaScript应用于asp开发场景
JavaScript应用于asp开发场景 演示代码示例: <%Path="../"%> <!--#include file="../../Inc/Con ...
- PlantUML —— 应用于 Eclipse 的简单快速的 UML 编辑软件
PlantUML —— 应用于 Eclipse 的简单快速的 UML 编辑软件 简介: 在应用系统软件开发过程中,如果软件由很多对象组成,它的结构仅仅凭借分析很难理清,同时为了有利于软件的开发及重用, ...
- SSD固态盘应用于Ceph集群的四种典型使用场景
在虚拟化及云计算技术大规模应用于企业数据中心的科技潮流中,存储性能无疑是企业核心应用是否虚拟化.云化的关键指标之一.传统的做法是升级存储设备,但这没解决根本问题,性能和容量不能兼顾,并且解决不好设备利 ...
随机推荐
- hdu 3280 动态规划
思路:dp[i][j]表示区间i,j变为回文串最少的代价. #include<map> #include<set> #include<cmath> #include ...
- loadrunner协议的选择
1. 任何高级协议的底层都是用Winsocket通信 2. 不管你系统中有多少个服务器,lr录制的始终是客户端与第一个服务器之间的通信内容, 客户端用IE访问的一般都选http协议(对于常见的,b ...
- JavaScript:exec()方法的用法及说明
最近在看某知名js框架的源码,突然间发现自己对exec()方法竟然不太理解,然后就仔细的分析了一下这个方法 下面贴个exec()方法使用的代码出来 rquickExpr = /^(?:\s*(< ...
- 六.CSS浮动与清除
浮动 把元素从常规文档流中取出.是元素脱离常规文档流 浮动的作用: ①实现文本绕排图片效果 ②让原本在上下方向上堆叠的块级元素可以变成左右并列,从而实现多栏布局 文本绕排图片 首先HTML代码如下 & ...
- Javascript之数据执行原理探究
Javascript在Web服务器端执行原理: 1.客户端请求数据,即我们在上网时在地址栏中输入某个网址,浏览器接收到数据之后,向远程web服务器发送请求报文. 2.web服务器响应请求,web服务器 ...
- cocos2dx-lua 批量打包及修改
coco2dx目前大部分开发者肯定是用lua解决问题,问题来了,每次改一下lua配置可能你每次都得运行 cocos luacompile -p android 针对不同的平台,可能会有某些配置会略有不 ...
- C#反射技术的简单操作(读取和设置类的属性)
public class A { public int Property1 { get; set; } } static void Main(){ A aa = new A(); Type type ...
- PHP调用WebService
1. 环境配置 配置php.ini,把php_soap.dll前面的分号去掉, 配置完成,需要重启. 2. PHP调用代码,如下 <?php try { $soap = new SoapCl ...
- HTTP Status 500 - An exception occurred processing JSP page /WEB-INF
HTTP Status 500 - An exception occurred processing JSP page /WEB-INF/test/showCountry.jsp at line 11 ...
- 关闭MyEclipse代码编辑器(breadcrumb)工具条
1. 在工具栏上找“Toggle Breadcrumb”按钮,单击使其恢复未选中状态即可 2. 如果找不到这个按钮.通过菜单“Window->Customize Perspective”打开对话 ...