MEF-(Managed Extensibility Framework)托管可扩展框架
目录
- MEF简介:
- 实例
- 实例1
- 例子2
- 总结一下MEF框架的好处:
- Demo 下载
MEF简介:
今天学习了下MEF框架,MEF,全称Managed Extensibility Framework(托管可扩展框架)。MEF是专门致力于解决扩展性问题的框架,MSDN中对MEF有这样一段说明:
Managed Extensibility Framework 或 MEF 是一个用于创建可扩展的轻型应用程序的库。 应用程序开发人员可利用该库发现并使用扩展,而无需进行配置。 扩展开发人员还可以利用该库轻松地封装代码,避免生成脆弱的硬依赖项。 通过 MEF,不仅可以在应用程序内重用扩展,还可以在应用程序之间重用扩展。
实例
实例1
新建个WPF程序–MEFtestpro,添加引用System.ComponentModel.Composition,MEF的核心就是在此类库中实现的
项目结构图:
添加一个接口IApple.cs
namespace MEFtestpro
{public interface IApple{string GetAppleColor();}
}
然后添加三个类RedApple.cs
{[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
新建控制台程序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不仅可以导出类,还可以导出方法,属性,不管是私有还是公有,从而满足更多的需求!
Demo 下载
http://download.csdn.net/download/wcc27857285/10030752
MEF-(Managed Extensibility Framework)托管可扩展框架相关推荐
- .NET MEF托管可扩展框架
MEF简介: 今天学习了下MEF框架,MEF,全称Managed Extensibility Framework(托管可扩展框架).MEF是专门致力于解决扩展性问题的框架,MSDN中对MEF有这样一段 ...
- Managed Extensibility Framework (MEF)
http://msdn.microsoft.com/zh-cn/library/dd460648(v=vs.110).aspx [.NET] 浅谈可扩展性框架:MEF 转载于:https://www. ...
- MEF(可扩展框架)使用总结
一般情况下,我们对系统要求: 1.对扩展开发对修改关闭 2.高层模块不应该依赖于低层模块,应该依赖于抽象 实际上,这是遵循了面向对象的设计原则中的开放封闭原则和依赖倒置原则,其所做的事情就是为了提高系 ...
- php扩展的框架,新一代轻量级PHP扩展框架 Asf
一.Asf 是什么? 全称 API Services Framework, 用C语言编写的轻量级PHP扩展框架, 专注于 API 开发. 二.解决了什么问题? 2.1 把复杂的逻辑简单化(降低错误率, ...
- Asp.net 面向接口可扩展框架之核心容器
新框架的容器部分终于调通了!容器实在太重要了,所以有用了一个名词叫"核心容器". 容器为什么那么重要呢?这个有必要好好说道说道. 1.首先我们从框架名称面向接口编程说起,什么是面向 ...
- AEAI WX微信扩展框架技术手册
1 概述 数通畅联微信公众号申请之后,由于要满足提供网站推广.功能演示.以及公司内部移动办公三方面的需求,所以把最初的订阅号更改为服务号,同时做了实名认证,这样就可以获取微信公众平台绝大部分接口,在完 ...
- 【安卓Framework学习】Wifi框架学习之wifi状态机
系列文章目录 [安卓Framework学习]Wifi框架学习之核心类. [安卓Framework学习]Wifi框架学习之开启与关闭流程. [安卓Framework学习]Wifi框架学习之连接与断开流程 ...
- IBM发布Open Liberty 18.0.0.4,支持MicroProfile 2.1和反应性扩展框架
IBM在2018年第四季度发布的Open Liberty 18.0.0.4提供了对MicroProfile 2.1.反应性扩展框架和连接池指标的全面支持.根据发布说明: Open Liberty现在对 ...
- Understanding the Framework (理解FMS框架)
FMS Framework 由 600 行没有文档的代码组成,毫无疑问很多开发者会开发自己的框架. 在本章,load几个.asc 文件,就在application中使用load()命令.比如: mai ...
最新文章
- 详细说说Transformer (超详细图解,一图胜千言)
- getaway网关转发去前缀_为什么微服务一定要有网关?
- 曾宝仪和机器人_你愿意和机器人成为终身伴侣吗?
- 卷积神经网络初步认知
- GDCM:检测SIEMENS JPEG无损压缩图像的测试程序
- OpenAI 挑战《索尼克》,阿里南大队如何一举夺魁?
- 消息发送到topic多个MessageQueue
- 关于面试时碰到的几个多线程手撕代码题
- 查看系统中支持CUDA的设备数量和属性---deviceQuery示例
- C++11常用特性的使用经验总结-概述及目录
- python的wget用法介绍_Python使用wget实现下载网络文件功能示例
- 我们是这样写升级日志的,处处可以体现人文情怀
- 最常用到的35种心理效应集锦
- MD5算法原理简要介绍并采用C#应用在桌面应用系统的用户登录与注册中
- MVC项目功能之加入购物车,清空购物车
- 开启运维自动化架构师成长之路
- python数据分析实战:DCM模型设计及实现(以波音公司用户选择为例)
- Cholesky分解(Matlab代码实现)
- Python读取指定文件夹中的所有图片并保存
- GMSK调制解调(二)