MEF学习小结 z
1.什么是MEF。
MEF,全称是Managed Extensibility Framework。它是.NET Framework4.0的一个类库,其主要目的是为了创建可扩展的应用程序。按照官方说法就是“用于简化在部署后可由第三方进行扩展的可组合系统的设 计。MEF 可使您的应用程序具有开放性,从而允许应用程序开发人员、框架编写者以及第三方扩展程序不断引入新功能”;
2.MEF的主要步骤。
1)第一步,定义导出Export。
指定程序通过相应的契约进行通信。可以有多个通信契约。而且通信契约可以是任何一个类。例如
|
1
2
3
4
5
6
7
8
9
10
|
[Export(typeof(IMEFFirst))][Export(typeof(Form))][ExportMetadata("Name", "FormMEFTest1")]public partial class FormMEFTest1 : Form, IMEFFirst{ public FormMEFTest1() { InitializeComponent(); } public string ControlTitle { get { return "FormMEFTest1"; } }} |
这里面。IMEFFirst是只定义的一个接口,其定义相当的简单
|
1
2
3
|
public interface IMEFFirst{ string ControlTitle { get;}} |
而Form则是窗体默认继承的父类。而ExportMetadata则是元数据,可以是一些对部件的描述。
2)第二步,定义导入Import
指出导出的位置。一般情况下,写法如下
|
1
|
[Import]public IMEFFirst IMEFFirstImportedMainFormContract { get; set; } |
|
|
如果有很多个部件需要导入,则必须用ImportMany,实现多个加载 |
|
1
|
[ImportMany]public Lazy<Form, IDictionary<string, object>>[] ImportedMainFormContracts { get; set; } |
|
|
|
Lazy<T, TMetadata>是延迟加载的意思,具体说明点击查看。其中Lazy<T>是可延迟实例的实例化,直至访问 Lazy 的 Value 属性。而Lazy<T, TMetadata>更是继承并扩展于Lazy<T>,
其可以在以允许在不实例化基础导出的情况下访问导出元数据。这句话的意思是,这里面实例的通过后面的TMetadata的类型,来获取元数据,这里用过的是IDictionary<string, object>,
也是就是通过字典的形式来导出。例如,可以这么使用
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
foreach (var export in this.ImportedMainFormContracts){ string menuTitle = export.Metadata["Name"] as string; if (String.IsNullOrEmpty(menuTitle)) { return; } if (menuTitle == thisItemTitle) { Form frm = export.Value as Form; if (frm == null) { return; } frm.Show(this); return; }} |
export.Metadata["Name"],这种写法就是因为其前面我们这样定义元数据视图:IDictionary<string, object>
3)第三步,使用
首先,通过下面这段方法,实现对newContainer的实例化。下面这个方法实现的功能是从指定目录下导入
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
private CompositionContainer newContainer; /// <summary> /// 加载指定路径的dll,并返回CompositionContainer /// </summary> /// <param name="strPath">DLL路径</param> /// <returns></returns> private CompositionContainer GetNewContainer(string strPath) { AggregateCatalog aggregateCatalog = new AggregateCatalog(); //var thisAssembly =new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()); //aggregateCatalog.Catalogs.Add(thisAssembly);//加载此程序的程序集 aggregateCatalog.Catalogs.Add(new DirectoryCatalog(strPath));//动态加载指定目录 CompositionContainer container = new CompositionContainer(aggregateCatalog); return container; } |
而后,通过
|
|
newContainer.ComposeParts(this); |
这个语句实现对前面指定的[ImportMany] 处ImportedMainFormContracts 的赋值。
本例源码下载
3.MEF相关学习材料
Managed Extensibility Framework 概述
MEF学习小结 z的更多相关文章
- (转) Parameter estimation for text analysis 暨LDA学习小结
Reading Note : Parameter estimation for text analysis 暨LDA学习小结 原文:http://www.xperseverance.net/blogs ...
- flex学习小结
接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...
- Python 学习小结
python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- C#可扩展编程之MEF学习笔记(三):导出类的方法和属性
前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...
- C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import)
上一篇学习完了MEF的基础知识,编写了一个简单的DEMO,接下来接着上篇的内容继续学习,如果没有看过上一篇的内容, 请阅读:http://www.cnblogs.com/yunfeifei/p/392 ...
- C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo
在文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架).单从名字我们不难发现:MEF是专门致力于解决扩展性问题的框架 ...
随机推荐
- Qt-获取主机网络信息之QNetworkAddressEntry
QNetworkAddressEntry类存储了一个网络接口所支持的一个IP地址,同时还有与之相关的子网掩码和广播地址. 每个网络接口可以包含0个或多个IP地址,这些IP地址可以分别关联一个子网掩码和 ...
- ehcache集群的配置
一:配置环境 本文是在测试demo的基础上写的,服务器包括申请的两台服务器和本机,共三台服务器.demo的目标是实现三台服务器之间共享cache. 申请的两台服务器地址分别是172.19.100.15 ...
- ViewState压缩
/// <summary> ///CompressViewState 的摘要说明 /// </summary> public class CompressViewState:S ...
- Javascript中setTimeout和setInterval的区别和使用
在javascript中,window对象有两个主要的定时方法,分别是setTimeout 和 setInterval,其语法基本上相同,但是完成的功能取有区别. setTimeout方法是定时程序, ...
- NOSQL之【WIN7的安装配置】
1.下载安装 大家根据各自系统配置,下载相对应的redis版本.我下载是redis 2.6 将redis.conf 复制到 bin/release/redisbin 里面 redis-server.e ...
- php 中文字符串首字母的获取函数
这篇文章介绍了php 中文字符串首字母的获取函数,有需要的朋友可以参考一下 function chineseFirst($str) { $str= iconv("UTF-8",&q ...
- mysql更改数据文件目录及my.ini位置| MySQL命令详解
需求:更改mysql数据数据文件目录及my.ini位置. 步骤: 1.查找my.ini位置,可通过windows服务所对应mysql启动项,查看其对应属性->可执行文件路径,获取my.ini路径 ...
- vb delphi7、2010 csharp vb.net空白测试程序
工作中难免在网上看到一段不错的代码,希望能够拿来测试一次,为了避免每次测试都要新建一个空白测试程序,索性预先建立好,要用的时候复制一遍,然后打开直接粘贴需要测试的代码进行测试.
- 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法
Dijkstra算法解决了有向图G=(V,E)上带权的单源最短路径问题,但要求所有边的权值非负. Dijkstra算法是贪婪算法的一个很好的例子.设置一顶点集合S,从源点s到集合中的顶点的最终最短路径 ...
- 由12306出错想到的div垂直居中的问题
今天想看看元旦回家还有没有余票,偷偷的打开了12306,开始查询回家的车票,结果发现,竟然查询不出来,再查直接出错了 看到这个很郁闷,很纠结,但是突然想到了最近一直想实现div垂直居中,赶紧试了一下1 ...