MEF(Managed Extensibility Framework)有选择性地使用扩展组件
在"MEF(Managed Extensibility Framework)使用全部扩展组件"中,客户端应用程序调用了所有的扩展组件,而且如果有新的扩展组件加入,必须先关闭程序,再重新启动才可以调用所有组件。
本篇体验使用MEF的ExportMetadata特性,有选择性地使用某些扩展组件,使用Lazy<>,让客户端程序延迟动态加载组件,即使不关闭应用程序,也能调用所有组件。

● StudentMEF.Lib, 类库,包含接口IStudent.cs
● StudentMEF.One,类库,包含实现IStudent的类One.cs
● StudentMEF.Two,类库,包含实现IStudent的类One.cs
● StudentMEF.Client,控制台程序
□ 所有扩展满足的约定是
namespace StudentMEF.Lib
{
public interface IStudent
{
string GetName();
int GetScore();
}
}
□ StudentMEF.One类库
→ 需引用StudentMEF.Lib组件
→ 需引用System.ComponentModel.Composition组件
using System.ComponentModel.Composition;
using StudentMEF.Lib;
namespace StudentMEF.One
{
[Export(typeof(IStudent))]
[ExportMetadata("Type","ONE")]
public class One : IStudent
{
private string _Name;
private int _Score;
public One()
{
_Name = "jack";
_Score = 80;
}
public string GetName()
{
return _Name;
}
public int GetScore()
{
return _Score;
}
}
}
□ StudentMEF.Two类库
→ 需引用StudentMEF.Lib组件
→ 需引用System.ComponentModel.Composition组件
using System.ComponentModel.Composition;
using StudentMEF.Lib;
namespace StudentMEF.Two
{
[Export(typeof(IStudent))]
[ExportMetadata("Type","TWO")]
public class Two : IStudent
{
private string _Name;
private int _Score;
public Two()
{
_Name = "Bob";
_Score = 90;
}
public string GetName()
{
return _Name;
}
public int GetScore()
{
return _Score;
}
}
}
□ StudentMEF.Client控制台程序
→ 需引用StudentMEF.Lib组件
→ 需引用System.ComponentModel.Composition组件
→ 需在可执行程序所在目录,即生成路径下,创建Extensions文件夹
需要一个帮助类StudentFactory,他的职责包括:
1、为了动态加载Extensions文件夹的所有扩展组件,可以使用Lazy<>来动态实现延迟加载,即只有当客户端程序使用到Extensions文件夹中组件的时候,再去加载这些扩展组件。
2、把扩展组件放到Catalog中,在CompositionContainer构建Part等,这些常规操作,也都需要。
3、提供一个方法,根据元数据ExportMetadata来获取对应的组件。
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using StudentMEF.Lib;
namespace StudentMEF.Client
{
public class StudentFactory
{
[ImportMany]
private Lazy<IStudent, IDictionary<string, object>>[] Students { get; set; }
public StudentFactory()
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog(@".\Extensions"));
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
public List<IStudent> GetStudents(string c)
{
List<IStudent> result = new List<IStudent>();
foreach (var student in Students)
{
if ((string)student.Metadata["Type"] == c)
{
result.Add(student.Value);
}
}
return result;
}
}
}
Lazy<IStudent, IDictionary<string, object>>中,第二个参数IDictionary<string, object>与ExportMetadata("Type","TWO")对应。
static void Main(string[] args)
{
string c = "";
while (true)
{
Console.WriteLine("输入学生类型:");
c = Console.ReadLine();
StudentFactory studentFactory = new StudentFactory();
List<IStudent> students = studentFactory.GetStudents(c.ToUpper());
if (students.Count == 0)
{
Console.WriteLine("没有此类型学生~");
}
else
{
foreach (IStudent student in students)
{
Console.WriteLine(string.Format("姓名:{0},分数:{1}",student.GetName(),student.GetScore()));
}
}
}
Console.ReadKey();
}
当Extensions文件夹中只有StudentMEF.One.dll组件,输入one,找到匹配,输入two找不到匹配;不关闭控制台程序,把StudentMEF.Two.dll也放入 Extensions文件夹,再输入two,找到匹配。

MEF(Managed Extensibility Framework)有选择性地使用扩展组件的更多相关文章
- MEF(Managed Extensibility Framework)使用全部扩展组件
MEF(Managed Extensibility Framework),所在命名空间是System.ComponentModel.Composition.dll.简单来说,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方便的扩展应用程序
概述 Managed Extensibility Framework(MEF)是.NET平台下的一个扩展性管理框架,它是一系列特性的集合,包括依赖注入(DI)以及Duck Typing等.MEF为开发 ...
- .Net中的插件框架Managed Extensibility Framework
Managed Extensibility Framework(MEF)是微软的一个用来扩展.NET应用程序的框架,它最初为了满足Visual Studio里的编辑器的需求,比如说,延迟加载所有东西和 ...
- 体验Managed Extensibility Framework精妙的设计
MEF(Managed Extensibility Framework)是.NET Framework 4.0一个重要的库,Visual Studio 2010 Code Editor的扩展支持也是基 ...
- 实战MEF(1)一种不错的扩展方式
在过去,我们完成一套应用程序后,如果后面对其功能进行了扩展或修整,往往需要重新编译代码生成新的应用程序,然后再覆盖原来的程序.这样的扩展方式对于较小的或者不经常扩展和更新的应用程序来说是可以接受的,而 ...
- Extjs 5 可选择日期+时间的组件DateTimeField
我们都知道ExtJs有日期组件DateField,但直到ExtJs 5.0版本该日期组件也只能选择日期,不能选择时间(具体到时.分.秒),而实际工作中又常常会有需要日期和时间同时选择的需求,我们只能自 ...
随机推荐
- C++ 必须使用初始化列表
继承关系中,父类无默认构造函数 类类型类成员变量无默认构造函数 const类型成员变量 引用类型成员变量 不使用初始化列表,在创建对象调用构造函数之前会对所有的成员变量进行默认初始化,然后再执行构造函 ...
- BCD码
BCD码(Binary-Coded Decimal)亦称二进码十进数或二-十进制代码,是用4位二进制数来表示1位十进制数中的0~9这10个数码,用一种使用二进制编码十进制的数字编码形式.BCD码这种 ...
- 【PAT】1016 部分A+B(15 分)
1016 部分A+B(15 分) 正整数 A 的“DA(为 1 位整数)部分”定义为由 A 中所有 DA 组成的新整数 PA.例如:给定 A=3862767,DA=6,则 A ...
- 同时装有py2 和3,运行scrapy如何区分
1未区分环境 python2 -m scrapy startproject xxx python3 -m scrapy startproject xxx 当然,执行的时候也是 python2 -m s ...
- 使用apache的ab命令进行压测
1. 背景:互联网发达的今天,大大小小的网站如雨后春笋,不断出现,但是想要做出一个网站很简单,但是想要做好一个网站,非常非常难,首先:网站做好之后的功能怎么样这都是次要的,主要的是你的网站能承受怎么样 ...
- mysql插入数据时,去掉重复的数据;
1. 利用insert ignore into语句去重 mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VA ...
- count 【mysql】
如果你的需要是统计总行数时,为什么要使用count(*),而避免使用指定具体的列名? count()函数里面的参数是列名的的时候,那么会计算这个字段有值项的次数.也就是,该字段没有值的项并不会进入计算 ...
- [leetcode tree]95. Unique Binary Search Trees II
Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ...
- PHP 二维数组根据某个字段排序 复制代码 array_multisort
//二维数组,按照里面的age从大到小降序,代码如下 <?php header('Content-Type:text/html;Charset=utf-8'); $arrUsers = arra ...
- [CF183D]T-shirt
[CF183D]T-shirt 题目大意: 有\(n(n\le3000)\)个人和\(m(m\le300)\)种T恤,每个人都有一种喜欢的T恤,你知道每个人喜欢每种T恤的概率\(p_{i,j}\). ...