目录

  • 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)托管可扩展框架相关推荐

  1. .NET MEF托管可扩展框架

    MEF简介: 今天学习了下MEF框架,MEF,全称Managed Extensibility Framework(托管可扩展框架).MEF是专门致力于解决扩展性问题的框架,MSDN中对MEF有这样一段 ...

  2. Managed Extensibility Framework (MEF)

    http://msdn.microsoft.com/zh-cn/library/dd460648(v=vs.110).aspx [.NET] 浅谈可扩展性框架:MEF 转载于:https://www. ...

  3. MEF(可扩展框架)使用总结

    一般情况下,我们对系统要求: 1.对扩展开发对修改关闭 2.高层模块不应该依赖于低层模块,应该依赖于抽象 实际上,这是遵循了面向对象的设计原则中的开放封闭原则和依赖倒置原则,其所做的事情就是为了提高系 ...

  4. php扩展的框架,新一代轻量级PHP扩展框架 Asf

    一.Asf 是什么? 全称 API Services Framework, 用C语言编写的轻量级PHP扩展框架, 专注于 API 开发. 二.解决了什么问题? 2.1 把复杂的逻辑简单化(降低错误率, ...

  5. Asp.net 面向接口可扩展框架之核心容器

    新框架的容器部分终于调通了!容器实在太重要了,所以有用了一个名词叫"核心容器". 容器为什么那么重要呢?这个有必要好好说道说道. 1.首先我们从框架名称面向接口编程说起,什么是面向 ...

  6. AEAI WX微信扩展框架技术手册

    1 概述 数通畅联微信公众号申请之后,由于要满足提供网站推广.功能演示.以及公司内部移动办公三方面的需求,所以把最初的订阅号更改为服务号,同时做了实名认证,这样就可以获取微信公众平台绝大部分接口,在完 ...

  7. 【安卓Framework学习】Wifi框架学习之wifi状态机

    系列文章目录 [安卓Framework学习]Wifi框架学习之核心类. [安卓Framework学习]Wifi框架学习之开启与关闭流程. [安卓Framework学习]Wifi框架学习之连接与断开流程 ...

  8. IBM发布Open Liberty 18.0.0.4,支持MicroProfile 2.1和反应性扩展框架

    IBM在2018年第四季度发布的Open Liberty 18.0.0.4提供了对MicroProfile 2.1.反应性扩展框架和连接池指标的全面支持.根据发布说明: Open Liberty现在对 ...

  9. Understanding the Framework (理解FMS框架)

    FMS Framework 由 600 行没有文档的代码组成,毫无疑问很多开发者会开发自己的框架. 在本章,load几个.asc 文件,就在application中使用load()命令.比如: mai ...

最新文章

  1. 详细说说Transformer (超详细图解,一图胜千言)
  2. getaway网关转发去前缀_为什么微服务一定要有网关?
  3. 曾宝仪和机器人_你愿意和机器人成为终身伴侣吗?
  4. 卷积神经网络初步认知
  5. GDCM:检测SIEMENS JPEG无损压缩图像的测试程序
  6. OpenAI 挑战《索尼克》,阿里南大队如何一举夺魁?
  7. 消息发送到topic多个MessageQueue
  8. 关于面试时碰到的几个多线程手撕代码题
  9. 查看系统中支持CUDA的设备数量和属性---deviceQuery示例
  10. C++11常用特性的使用经验总结-概述及目录
  11. python的wget用法介绍_Python使用wget实现下载网络文件功能示例
  12. 我们是这样写升级日志的,处处可以体现人文情怀
  13. 最常用到的35种心理效应集锦
  14. MD5算法原理简要介绍并采用C#应用在桌面应用系统的用户登录与注册中
  15. MVC项目功能之加入购物车,清空购物车
  16. 开启运维自动化架构师成长之路
  17. python数据分析实战:DCM模型设计及实现(以波音公司用户选择为例)
  18. Cholesky分解(Matlab代码实现)
  19. Python读取指定文件夹中的所有图片并保存
  20. GMSK调制解调(二)

热门文章

  1. onclick 阻止冒泡
  2. Nasm汇编GDB调试
  3. c++自制背单词应用
  4. Midjourney的一些“咒语”【自用-1】
  5. 易基因:MeRIP-seq等揭示m6A甲基化修饰对抗病毒基因表达的转录调控机制|Cell Rep
  6. LogoErase:去除移印、丝印、印刷Logo,抹字水(防白水)
  7. 烈火网 2011年3月15日 新闻、教程、资源归档
  8. 如何编译linux驱动ko
  9. 压电陶瓷薄膜材料介电性能检测
  10. 在提高用户量的目标下,如何确定拉新数?转换率如何知晓?