MEF(Managed Extensibility Framework)使用全部扩展组件
MEF(Managed Extensibility Framework),所在命名空间是System.ComponentModel.Composition.dll。简单来说,MEF是将符合约定(一般是实现接口)的组件的Parts(类、方法和属性可看作是Part)标记为Export特性,再把这些组件放到与可执行程序同目录的Extensions文件夹中,最后通过把Part标记为Import来引用这些组件,从而为我们创建可扩展组件提供了方便。
以球员踢球为例,体验MEF的工作原理和便捷之处。 
● HelloMEF.Lib,类库,包含了一个接口IPlay,即约定
● HelloMEF.BackPlay,类库,包含了一个实现IPlay接口的类Back.cs
● HelloMEF.FowardPlay, 类库,包含一个实现IPlay接口的类Foward.cs
● Portal,控制台应用程序
□ 可扩展的前提是满足约定,即接口
namespace HelloMEF.Lib
{
public interface IPlay
{
string PlaySoccer(string name, string position);
}
}
□ HelloMEF.BackPlay类库中的Back.cs实现IPlay接口
→引用HelloMEF.Lib组件
→引用System.ComponentModel.Composition组件
using System.ComponentModel.Composition;
using HelloMEF.Lib;
namespace HelloMEF.BackPlay
{
[Export(typeof(IPlay))]
public class Back : IPlay
{
public string PlaySoccer(string name, string position)
{
return string.Format("我是{0},司职{1},我的主要任务是防守和传球~~", name, position);
}
}
}
□ HelloMEF.FowardPlay类库中的Foward.cs实现IPlay接口
→引用HelloMEF.Lib组件
→引用System.ComponentModel.Composition组件
using System.ComponentModel.Composition;
using HelloMEF.Lib;
namespace HelloMEF.FowardPlay
{
[Export(typeof(IPlay))]
public class Forward : IPlay
{
public string PlaySoccer(string name, string position)
{
return string.Format("我是{0},司职{1},我的主要任务是传球和射门~~", name, position);
}
}
}
□ 控制台程序
→引用HelloMEF.Lib组件
→引用System.ComponentModel.Composition组件
→在可执行文件所在目录,即输出路径下,创建Extensions文件夹

假设,满足约定的一个或多个组件已经方在Extensions文件夹中了,还需要做的大致包括:
→把所有的组件放在Catalog中
→放到CompositionContainer容器中
→在CompositionContainer容器中组合组件
→以Import标记,注入到某个Part上,比如属性上,由程序来决定使用全部或某些组件
using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using HelloMEF.Lib;
namespace Portal
{
class Program
{
[ImportMany(typeof(IPlay))]
public IPlay[] Plays { get; set; }
static void Main(string[] args)
{
Program p = new Program();
p.ShowTeam();
Console.ReadKey();
}
public void ShowTeam()
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog(@".\Extensions"));
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
string name = "";
string position = "";
while (true)
{
Console.WriteLine("输入球员名称");
name = Console.ReadLine();
Console.WriteLine("输入球员位置");
position = Console.ReadLine();
foreach (IPlay play in Plays)
{
Console.WriteLine(play.PlaySoccer(name, position));
}
}
}
}
}
Extensions文件夹只有HelloMEF.FowardPlay.dll,效果如下: 
Extensions文件夹中包含HelloMEF.FowardPlay.dll和HelloMEF.BackPlay.dll,效果如下:

MEF(Managed Extensibility Framework)使用全部扩展组件的更多相关文章
- MEF(Managed Extensibility Framework)有选择性地使用扩展组件
在"MEF(Managed Extensibility Framework)使用全部扩展组件"中,客户端应用程序调用了所有的扩展组件,而且如果有新的扩展组件加入,必须先关闭程序,再 ...
- 使用Managed Extensibility Framework方便的扩展应用程序
概述 Managed Extensibility Framework(MEF)是.NET平台下的一个扩展性管理框架,它是一系列特性的集合,包括依赖注入(DI)以及Duck Typing等.MEF为开发 ...
- MEF(Managed Extensibility Framework) 微软平台插件化开发
体验Managed Extensibility Framework精妙的设计 MEF(Managed Extensibility Framework)是.NET Framework 4.0一个重要 ...
- MEF(Managed Extensibility Framework)依赖注入学习
MSDN官方资料,并且微软还提供了SimpleCalculator sample学习样例 http://msdn.microsoft.com/en-us/library/dd460648(v=vs.1 ...
- MEF(Managed Extensibility Framework )的入门介绍
1.什么是MEF MEF是一个来自于微软协作构建扩展应用的新框架,它的目的是在运行中的应用中添加插件.MEF继承于.NET 4.0 Framework平台,存在于各种应用平台的系统程序集中 2.程序集 ...
- 体验Managed Extensibility Framework精妙的设计
MEF(Managed Extensibility Framework)是.NET Framework 4.0一个重要的库,Visual Studio 2010 Code Editor的扩展支持也是基 ...
- .Net中的插件框架Managed Extensibility Framework
Managed Extensibility Framework(MEF)是微软的一个用来扩展.NET应用程序的框架,它最初为了满足Visual Studio里的编辑器的需求,比如说,延迟加载所有东西和 ...
- Yii Framework 开发教程Zii组件-Tabs示例
有关Yii Tab类: http://www.yiichina.com/api/CTabView http://www.yiichina.com/api/CJuiTabs http://blog.cs ...
- easyUI扩展组件
$.parser.plugins.push("aa"); //注册扩展组件 $.fn.aa= function (options, param) {//定义扩展组件 //当opti ...
随机推荐
- inherited 的研究。
结论: 1. inherited默认调用的是父类的同名 同参数方法.(常用,如果是同名 同参数方法 比如 overide 的,可以省略,只写个inherited就可.) 2. 子类的方法里可以 inh ...
- Laravel 程序架构设计思路:使用动作类
当我们谈论到应用程序的架构的时候,经常会问到一个经典的问题,那就是"这段代码应该放在哪里比较好". 因为 Laravel 是一个相当灵活的框架,所以要回答这个问题其实没那么容易.我 ...
- Luogu P1160 【队列安排】
详细的链表讲解 很明显的一个链表裸题 和普通的链表有一个区别就是这个题 可以O(1)插入,O(1)查询 然后我们为了方便,采用双向链表,定义s.f作为指针数组 更详细的解释见代码 #include&l ...
- 函数fgets和fputs、fread和fwrite用法小结(转)
字符串读写函数fgets和fputs: 1.fgets()函数:原型char *fgets(char *s, int n, FILE *stream);从流中读取n-1(n默认1024)个字符之前,如 ...
- TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小.TreeMap要求存放的键值对映射的键必 ...
- 树莓派3B安装远程
步骤1:树莓派3安装 RDP SERVER 及VNC SERVER sudo apt-get install -y tightvncserver sudo vncserver 最后才知道一定要加上VN ...
- Sample ASP.NET IHttpHandler
LoggerHandler.cs using System; using System.Collections.Generic; using System.Diagnostics; using Sys ...
- spring boot在控制台输出彩色日志
阅读org.springframework.boot.context.config.AnsiOutputApplicationListener 源码发现,通过向JVM传递参数,可以在控制台打印彩色日志 ...
- 镣铐之舞:美团安全工程师Black Hat USA演讲
背景 2018年8月9日,全球顶级安全会议——Black Hat USA在美国拉斯维加斯的曼德勒海湾会议中心落下了帷幕,这场盛会在全球黑客心中几乎等同于“世界杯”和“奥斯卡”一样的存在.这场一年一度的 ...
- (四)静态断言(上),assert,NDEBUG, 以及通过宏定义处理文件包含关系
一.断言:运行时与预处理时 断言(assertion)是一种编程常用的手段.想必大家都见过 assert 吧.今天我们就来了解一下它. 通常情况下,断言就是将一个返回值总是需要为真的判别式放在语句中, ...