1.什么是MEF。

MEF,全称是Managed Extensibility Framework。它是.NET Framework4.0的一个类库,其主要目的是为了创建可扩展的应用程序。按照官方说法就是“用于简化在部署后可由第三方进行扩展的可组合系统的设 计。MEF 可使您的应用程序具有开放性,从而允许应用程序开发人员、框架编写者以及第三方扩展程序不断引入新功能”;

2.MEF的主要步骤。

1)第一步,定义导出Export。

指定程序通过相应的契约进行通信。可以有多个通信契约。而且通信契约可以是任何一个类。例如

 
1
2
3
4
5
6
7
8
9
10
[Export(typeof(IMEFFirst))]
[Export(typeof(Form))]
[ExportMetadata("Name", "FormMEFTest1")]
public partial class FormMEFTest1 : Form, IMEFFirst
{
    public FormMEFTest1()
    {
        InitializeComponent();
    }
    public string ControlTitle { get { return "FormMEFTest1"; } }
}

这里面。IMEFFirst是只定义的一个接口,其定义相当的简单

 
1
2
3
public interface  IMEFFirst
{
    string ControlTitle { get;}
}

而Form则是窗体默认继承的父类。而ExportMetadata则是元数据,可以是一些对部件的描述。

2)第二步,定义导入Import

指出导出的位置。一般情况下,写法如下

 
1
[Import]
public IMEFFirst IMEFFirstImportedMainFormContract { get; set; }
 
如果有很多个部件需要导入,则必须用ImportMany,实现多个加载
 
1
[ImportMany]
public Lazy<Form, IDictionary<string, object>>[] ImportedMainFormContracts { get; set; }
 
 
Lazy<T, TMetadata>是延迟加载的意思,具体说明点击查看。其中Lazy<T>是可延迟实例的实例化,直至访问 Lazy 的 Value 属性。而Lazy<T, TMetadata>更是继承并扩展于Lazy<T>,
其可以在以允许在不实例化基础导出的情况下访问导出元数据。这句话的意思是,这里面实例的通过后面的TMetadata的类型,来获取元数据,这里用过的是IDictionary<string, object>,
也是就是通过字典的形式来导出。例如,可以这么使用
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
foreach (var export in this.ImportedMainFormContracts)
{
    string menuTitle = export.Metadata["Name"] as string;
    if (String.IsNullOrEmpty(menuTitle))
    {
        return;
    }
    if (menuTitle == thisItemTitle)
    {
        Form frm = export.Value as Form;
        if (frm == null) { return; }
        frm.Show(this);
        return;
    }
}
export.Metadata["Name"],这种写法就是因为其前面我们这样定义元数据视图:IDictionary<string, object>

3)第三步,使用

首先,通过下面这段方法,实现对newContainer的实例化。下面这个方法实现的功能是从指定目录下导入
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private CompositionContainer newContainer;
 
  /// <summary>
  /// 加载指定路径的dll,并返回CompositionContainer
  /// </summary>
  /// <param name="strPath">DLL路径</param>
  /// <returns></returns>
  private CompositionContainer GetNewContainer(string strPath)
  {
      AggregateCatalog aggregateCatalog = new AggregateCatalog();
      //var thisAssembly =new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
      //aggregateCatalog.Catalogs.Add(thisAssembly);//加载此程序的程序集
        aggregateCatalog.Catalogs.Add(new DirectoryCatalog(strPath));//动态加载指定目录
      CompositionContainer container = new CompositionContainer(aggregateCatalog);
      return container;
  }
而后,通过
 
newContainer.ComposeParts(this);
这个语句实现对前面指定的[ImportMany] 处ImportedMainFormContracts 的赋值。

本例源码下载

3.MEF相关学习材料

Managed Extensibility Framework 概述

托管可扩展性框架

MEF学习小结 z的更多相关文章

  1. (转) Parameter estimation for text analysis 暨LDA学习小结

    Reading Note : Parameter estimation for text analysis 暨LDA学习小结 原文:http://www.xperseverance.net/blogs ...

  2. flex学习小结

    接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...

  3. Python 学习小结

    python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...

  4. react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)

    react学习小结   本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...

  5. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  6. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  7. C#可扩展编程之MEF学习笔记(三):导出类的方法和属性

    前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...

  8. C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import)

    上一篇学习完了MEF的基础知识,编写了一个简单的DEMO,接下来接着上篇的内容继续学习,如果没有看过上一篇的内容, 请阅读:http://www.cnblogs.com/yunfeifei/p/392 ...

  9. C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo

    在文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架).单从名字我们不难发现:MEF是专门致力于解决扩展性问题的框架 ...

随机推荐

  1. 分页 page

    1.根据条件计算出数据的总数 2.import(page类); 3.实例化分页类 4.设置相关的参数 5.调用show()方法 // 导入分页类  import('ORG.Util.Page');$p ...

  2. C# 异步下载文件

    在C#当中,利用WebClient这个核心类,可以轻易的打造一个下载器.但是这里想要强调的是,我们用的是异步操作.所谓异步,是相对于同步的概念而言的.比如Web中的Ajax就是基于异步的.它能够提供良 ...

  3. Delphi调用一个外部程序时,如何把外部程序的窗体放在主程序窗体的Panel上?

    uses shellapi; ... procedure TForm1.Button2Click(Sender: TObject); var vh: HWND; begin ShellExecute( ...

  4. C语言之广度优先算法

    广度优先算法又称宽度优先搜索,是一种简便的图的搜索算法之一.搜索方式大致是这样的: 直到搜索到目标结点(结点就是那些圆球球,其中有一个或者多个是目标结点)或者搜完了整个图都没找到目标结点就停止搜索. ...

  5. Java EJX

    EJX http://www.docin.com/p-121548732.html

  6. C++引用计数

    简介 引用计数就是对一个对象记录其被引用的次数,其的引用计数可加可减,那什么时候加什么时候减呢?所以引用计数的重点在于在哪里加,在哪里减: 加: 减: 实现 // // Ref.hpp // Ref ...

  7. Automotive Security的一些资料和心得(5):Privacy

    1. Introduction 1.1 "Customers own their data and we can be no more than the trsted stewards of ...

  8. hdu 4267

    一个很不错的题: 刚刚看到这个题目就感觉要用线段树或者树状数组,但是有感觉有点不同: 敲了一发简单的线段树之后果断的T了: 网上一搜题解,发现要用55颗线段树或者树状数组: 一共有k种树,然后每种树根 ...

  9. win7 不能启动 memcached 总是反回failde to start service

    原地址: http://zhidao.baidu.com/link?url=Ul9hJxFckU9IHWRy0pcxT11f2c0-p2uXkXhLria73mLNxYuV7IiaKYRtIl6vED ...

  10. 1880-A. 偷吃可耻

    描述 EATER买来一堆好吃的,总共N+1份,共(N+1)/2种,每种准备了两份,同种都标上了相同的编号.本来准备与他家吃货一同分享,结果却发现被人偷吃了..EATER发现总数少了一个,所以你的任务就 ...