.NET框架之---MEF托管可扩展框架
MEF简介:
今天学习了下MEF框架,MEF,全称Managed Extensibility Framework(托管可扩展框架)。MEF是专门致力于解决扩展性问题的框架,MSDN中对MEF有这样一段说明:
Managed Extensibility Framework 或 MEF 是一个用于创建可扩展的轻型应用程序的库。 应用程序开发人员可利用该库发现并使用扩展,而无需进行配置。 扩展开发人员还可以利用该库轻松地封装代码,避免生成脆弱的硬依赖项。 通过 MEF,不仅可以在应用程序内重用扩展,还可以在应用程序之间重用扩展。
我们通过例子1来看下MEF是如何工作的:
例子1:
新建个WPF程序--MEFtestpro,添加引用System.ComponentModel.Composition,MEF的核心就是在此类库中实现的
项目结构图:
添加一个接口IApple.cs
namespace MEFtestpro
{
public interface IApple
{
string GetAppleColor();
}
}
然后添加三个类RedApple.cs
namespace MEFtestpro
{
[Export ("Apple",typeof(IApple))] //将RedApple类导出类型为IApple接口
class RedApple : IApple
{
public string GetAppleColor()
{
return "Red";
}
}
[Export("Apple", typeof(IApple))] //将GreedApple类导出类型为IApple接口
class GreedApple : IApple
{
public string GetAppleColor()
{
return "Green";
}
}
[Export("Apple", typeof(IApple))] //将YellowApple类导出类型为IApple接口
class YellowApple : IApple
{
public string GetAppleColor()
{
return "Yellow";
}
}
}
最后,主程序MainWindow.xaml.cs
namespace MEFtestpro
{
public partial class MainWindow : Window
{
[ImportMany("Apple")] //Apple是契约名字,可以任意起,但是要注意别重名
public IEnumerable<IApple> Apples { get; set; }
public MainWindow()
{
InitializeComponent();
this.Compose();
if (this.Apples != null)
{
string s=string.Empty;
foreach (var apple in Apples) //将内容显示在label上
{
s=s+ apple.GetAppleColor()+"\r\n";
label.Content = s;
}
}
}
//这个方法表示添加当前Program这个类到组合容器,为什么要添加到组合容器?
//是因为只要添加到组合容器中之后,如果该类里面有Import,MEF才会自动去寻找对应的Export。
//这也就是为什么使用MEF前必须要组合部件的原因。
private void Compose()
{
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
CompositionContainer container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
}
}
然后运行看结果,如下:
可以看到,我们没有实例化类,而是仅仅通过Export和Import一个中间类型(IApple),就实现了调用类中的方法!
这就实现了主程序和类之间的解耦,大大提高了代码的扩展性和易维护性!
可能有人就会说多此一举,既然我们可以实例化类,为什么非要用这种奇怪的语法。
其实如果我们站在软件框架设计的层面,它的好处就是可以减少dll之间的引用,使你的程序更加健壮可扩展
接下来请看例子2.
例子2:
新建控制台程序MEFtestPro2
项目结构图:
新增.NET类库Fruit,里面包含了一个接口IFruit
namespace Fruit
{
public interface IFruit
{
string GetFruitName();
}
}
新增.NET类库Banana,引用Fruit.DLL
namespace Banana
{
[Export(typeof(IFruit))]
public class Banana : IFruit
{
public string GetFruitName()
{
return "Banana";
}
}
}
新增.NET类库Orange,引用Fruit.DLL
namespace Orange
{
[Export(typeof(IFruit))]
public class Orange : IFruit
{
public string GetFruitName()
{
return "Orange";
}
}
}
最后主程序program.cs,引用Fruit.DLL
namespace MEFtestPro2
{
class Program
{
[ImportMany(typeof(IFruit))]
public IEnumerable<IFruit> fruits { get; set; }
static void Main(string[] args)
{
Program pro = new Program();
pro.Compose();
foreach (var f in pro.fruits) //打印输出
{
Console.WriteLine(f.GetFruitName());
}
Console.Read();
}
private void Compose()
{
var catalog = new DirectoryCatalog("fruits"); //fruits是一个目录名称,就是主程序所在目录(bin-Debug-fruits)文件夹(我们需要提前建立好)
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
}
}
现在,我们把生成的Banana.dll和Orange.dll拷贝到这个文件夹下,如图:
然后运行才可以正确输出信息(毕竟我们没有引用那个项目),如图:
注意,我们仅仅是把Banana.dll和Orange.dll拷贝到我们指定的目录,然后通过MEF导入导出中间类型(IFruit),
实现了主程序调用未知的DLL中的方法,而主程序并未引用该DLL
总结一下MEF框架的好处:
1.解耦。试想下,如果主程序引用了Banana.dll和Orange.dll,那么就意味着你可以无限制的开放DLL中类,属性,方法的访问权限,也就意味着主程序中会出现很多耦合的代码,哪天你想移除这个DLL,程序肯定编译失败,而且你要手动删除这些耦合代码,而MEF因为是通过中间接口来完成调用的,所以只向外暴露了接口里面的成员,程序员是无法任意调用DLL中的任何方法,只能通过接口来调用。就算删掉这个DLL,程序也能正常运行!
2.可扩展性。举个例子,假设你的程序已经移交给客户了,哪天客户说我不想看Banana了,我想换一个水果,苹果Apple,这时,你只需重写一个Apple.DLL,使其继承并实现IFruit接口,然后,只要将Apple.dll交给客户,并让其覆盖Banana.DLL,打开程序,你会发现香蕉变成了苹果。是不是很方便!如果是以前,你可能得重新将所有有关banana的东西全部替换,然后重新编译,发布,再将整个程序移交客户,这样说大家应该都明白了!
3.MEF不仅可以导出类,还可以导出方法,属性,不管是私有还是公有,从而满足更多的需求!
最后,有人需要上述的源程序例子,可点击链接下载:http://download.csdn.net/download/wcc27857285/10030752
参考资料:http://www.cnblogs.com/yk123/p/5350133.html
未完待续。。。。。
.NET框架之---MEF托管可扩展框架的更多相关文章
- 面向接口可扩展框架之“Mvc扩展框架及DI”
面向接口可扩展框架之“Mvc扩展框架及DI” 标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把 ...
- 浅谈可扩展性框架:MEF
之前在使用Prism框架时接触到了可扩展性框架MEF(Managed Extensibility Framework),体验到MEF带来的极大的便利性与可扩展性. 此篇将编写一个可组合的应用程序,帮助 ...
- Asp.net 面向接口可扩展框架之业务规则引擎扩展组件
随着面向接口可扩展框架的继续开发,有些功能开发出现了"瓶颈",有太多的东西要写死才好做.但写死的代码扩展性是非常的不好,迷茫中寻找出入... 进而想到我以前开发的好几个项目,都已有 ...
- Asp.net 面向接口可扩展框架之“Mvc扩展框架及DI”
标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整 ...
- Asp.net 面向接口可扩展框架之数据处理模块及EntityFramework扩展和Dapper扩展(含干货)
接口数据处理模块是什么意思呢?实际上很简单,就是使用面向接口的思想和方式来做数据处理. 还提到EntityFramework和Dapper,EntityFramework和Dapper是.net环境下 ...
- Asp.net 面向接口可扩展框架之消息队列组件
消息队列对大多数人应该比较陌生.但是要提到MQ听说过的人会多很多.MQ就是英文单词"Message queue"的缩写,翻译成中文就是消息队列(我英语差,翻译错了请告知). PS: ...
- Asp.net 面向接口可扩展框架之使用“类型转化基础服务”测试四种Mapper(AutoMapper、EmitMapper、NLiteMapper及TinyMapper)
Asp.net 面向接口可扩展框架的“类型转化基础服务”是我认为除了“核心容器”之外最为重要的组成部分 但是前面博文一出,争议很多,为此我再写一篇类型转化基础服务和各种Mapper结合的例子,顺便对各 ...
- Asp.net 面向接口可扩展框架之类型转化基础服务
新框架正在逐步完善,可喜可贺的是基础服务部分初具模样了,给大家分享一下 由于基础服务涉及面太广,也没开发完,这篇只介绍其中的类型转化部分,命名为类型转化基础服务,其实就是基础服务模块的类型转化子模块 ...
- Asp.net 面向接口可扩展框架之核心容器(含测试代码下载)
新框架的容器部分终于调通了!容器实在太重要了,所以有用了一个名词叫“核心容器”. 容器为什么那么重要呢?这个有必要好好说道说道. 1.首先我们从框架名称面向接口编程说起,什么是面向接口编程?(这个度娘 ...
随机推荐
- AutoIt自动化编程(4)【转】
五.自动化操作轻松入门系列5 控件操作 然而,在真正实现自动化时仅靠上面的技术往往难以达到预期目的.下面开始进入最为重要的控件操作. 1.设置文本 在安装软件的过程中用户往往需要提供一些必需信息,比如 ...
- JavaWeb中请求转发和请求重定向的区别
针对于JavaWeb中请求与重定向的一个cheatsheep: 1.转发 1)完成一次转发,用户浏览器发送一次请求 2)转发之后,浏览器URL地址栏不改变(服务器帮忙完成) 3)请求域中数据不丢失 4 ...
- 07.27NOIP模拟赛
戳这里下载过去三次NOIP模拟赛总成绩 (别嘲笑垫底的我...解压密码为信奥生所在的两个班的班号,文档密码为机房开机用户名+密码) 又一次垫底…… 我难受. 上来感觉T1不可做,T2和蔼可亲,T3一脸 ...
- poj 3682 King Arthur's Birthday Celebration (期望dp)
传送门 解题思路 第一问比较简单,设$f[i]$表示扔了$i$次正面向上的硬币的期望,那么有转移方程 : $f[i]=f[i]*(1-p)+f[i-1]*p+1$,意思就是$i$次正面向上可以 ...
- H5在部分苹果手机IOS系统下重力感应无效
原因不明,反正在IOS系统12.2以上的普通的H5移动端网页的重力感应功能无反应 解决方法: 把链接改为HTTPS,经过测试,12.2系统以上的如果你的链接是HTTP的,重力感应在网页上是没调起的,改 ...
- LintCode刷题笔记-- A+B problem
标签: 位运算 描述 Write a function that add two numbers A and B. You should not use + or any arithmetic ope ...
- 2019暑训第一场训练赛 |(2016-icpc区域赛)部分题解
// 今天下午比赛自闭了,晚上补了题,把AC的部分水题整理一下,记录坑点并吸取教训. // CF补题链接:http://codeforces.com/gym/101291 A - Alphabet 题 ...
- 慢日志:mysqlsla
Linux服务器收集到的慢日志文件拿到本地(Windows7)的虚拟机(CentOS6.5)中去分析.首先使用Samba工具配置CentOS和Windows文件共享,然后使用mysqlsla分析慢查询 ...
- UDP和TCP的区别?
区别总结: 1.TCP面向连接,UDP的面向无连接的,即发送数据之前不需要建立简介. 2.TCP提供可靠的数据传输,有发送应答机制,超时重传机制,错误校验机制,流量控制机制保证传输的安全,不丢失,不重 ...
- pdftk
功能介绍: 如果PDF是一张电子纸,Pdftk就是一个印戳涂抹器.打孔机.浆糊.显影液.和一个X光玻璃.Pdftk是一个简单的PDF万用工具,使用它,你可以:合并PDF文档分割PDF旋转PDF页面解密 ...