MEF 一、基本概念 二、框架图示 三、基本使用示例 四、总结

MEF
一、基本概念
二、框架图示
三、基本使用示例
四、总结

MEF

从接触MEF到现在,已经有些年头了,虽然有些年头,但一直未在实际项目中使用,这可能是因为它的Framework框架太高,毕竟目前公司的主流项目都是用Framework 3.5。如此,冷落了它,有点可惜。最近可能会需要用到了,所以写一些笔记,来让自己熟悉起来。

题外话说一下,最近公司的小组里面一位成员要离开了,小组中也就我和他有对领域驱动设计有所研究,还没好好合作一次呢,也真是可惜。的确,这世间就是有太多的可惜,也许,哪天不如意了,我也会离开。当然,这一切都是题外话,偶尔的伤感和牢骚后,我们应该继续向前看,毕竟,向前看脖子才不酸(相比起仰视)。

废话不多说了,下面,我们进入正题吧。

  • MEF:Managed Extensibility Framework,.NET 4.0中带来的一个基于托管的扩展程序开发框架(挺拗口的,不过只是概念),另外通过强大的百度百科,我们发现MEF还是“小鼠胚胎成纤维细胞”的简称(这货是?)。
  • Contract:契约,即一种约定,具体在代码中表现为接口和抽象类。自从进入.NET 4.0,契约这个单词我们应该不会陌生,WCF中贯穿着各种契约,无论如何,契约就是一种约定。
  • Import:导入,导入契约的实现,说明此处需要一个实现的契约。
  • Export:导出,导出契约的实现,说明相应的类中实现了相应的契约。
  • Part:部件,即实现契约的类。
  • Catalog:目录(我是这样定义的),存放部件的地方,当需要某个部件时,会在目录中寻找。
  • Container:容器,存放目录并进行部件管理,如导出、导入等。
  • Compose:组装,通过容器在目录中寻找到实现了相应契约的部件,进行部件的组装。

二、框架图示

MEF
一、基本概念
二、框架图示
三、基本使用示例
四、总结

不是很会作图,上面的图就将就着看吧。一个Component Import了两个Contract,分别是Contract 1和Contract 2,一个Catalog中有两个Part并且Export了上诉的两个Contract,最后,Component通过Container的Compose操作,实例化了两个Contract。(我表述的不是很好,说的很拗口,但MEF是非常简单的框架,坚持看下去,你一定会学会的)

三、基本使用示例

下面到了动手操作的时候了,打开Visual Studio,新建一个.NET 4的控制台项目【MyMEFApplication】,添加对MEF库的引用,即“System.ComponentModel.Composition”。

1、添加一个契约

//这便是我们的契约 Contract
public interface ICalculator {

    int Add(int a, int b);

    int Sub(int a, int b);
}

2、实现这个契约

//此处我们导出了契约,这就是一个部件
   [Export(typeof(ICalculator))]
   public class MyCalculator : ICalculator {

       public int Add(int a, int b) {
           Console.WriteLine("Add Invoked");
           return a + b;
       }

       public int Sub(int a, int b) {
           Console.WriteLine("Sub Invoked");
           return a - b;
       }
   }

3、完成测试程序

class Program {

    private static CompositionContainer _container;

    static void Main(string[] args) {
        //AssemblyCatalog 目录的一种,表示在相应的程序集中搜索
        var catalog = new AssemblyCatalog(typeof(Program).Assembly);
        _container = new CompositionContainer(catalog);

        MathCompute mathCompute = new MathCompute();
        _container.ComposeParts(mathCompute);//组装部件

        Console.WriteLine(mathCompute.Add(1, 3));
        Console.WriteLine(mathCompute.Sub(3, 2));

        Console.ReadLine();
    }
}

public class MathCompute {

    //我们需要导入这个契约实现的部件
    [Import(typeof(ICalculator))]
    private ICalculator _calculator;


    public int Add(int a, int b) {
        return _calculator.Add(a, b);
    }

    public int Sub(int a, int b) {
        return _calculator.Sub(a, b);
    }

}

由于时间仓促,本次示例相当简单,并且无实际意义,接下来的实例,我会尽量弄些有实际意义的东西。

四、总结

本篇笔记中,我们大致的了解了MEF的使用,并且完成了一个很无聊的应用程序。我们熟知了什么是导入、导出,什么是契约、容器,这样就够了。

源码下载(请点击)

作者:Sun.M
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
 
 

随笔分类 -C#

MEF核心笔记(6)让 MEF 拥抱 AOP

2014-04-13 22:39 by Sun.M, 571 visits, 网摘收藏编辑
摘要: 距离上一篇日志到今天,已经快有一年的间隔时间了。这一年多的时间里,发生了太多的事情,我从一个单身汉,变成如今拥有一对双胞胎儿子的老爹。上天的对我的眷顾总是让我措手不及,无论是压力还是动力,总还是需要积极面对的。闲话就说到这里,本来上一篇应该为MEF系列的结尾,但还是有很多东西需要记录下,于是有了这一篇。阅读全文

MEF核心笔记(5)是模式还是设计

2013-04-18 22:12 by Sun.M, 1150 visits, 网摘收藏编辑
摘要: 最近事情很多,有烦恼,有悲伤,不过,一切想通后,感觉其实也没什么。毕竟,这是每个人都要经历了,那么恭喜自己,就要当爸爸了,一个程序员爸爸。 所以,好久没写博客了,今天,我们继续来说MEF,这也是MEF的最后一篇博文。 阅读全文

MEF核心笔记(4)细说MEF中的Attribute [下]

2013-04-09 21:29 by Sun.M, 537 visits, 网摘收藏编辑
摘要: 今天,我们继续MEF的学习记录,这次内容感觉比较重要,所以,特别放到单独一篇来说,这也是MEF很有特色的地方,相信这其中的亮点,会让你感触良多的。 本篇主要有以下几节内容: 部件的创建规则 元数据和元数据视图 部件组装通知 总结 一、部件的创建规则 我们知道,在目前主流的IoC框架里,注入对象的创建都可以进行个性化配置,例如是否以单例方式创建(也就是共享一个对象,给所有需要注入的地方调用)...阅读全文

MEF核心笔记(3)细说MEF中的Attribute [上]

2013-04-06 17:25 by Sun.M, 560 visits, 网摘收藏编辑
摘要: 又到了写笔记的时候了,这次的内容网罗了MEF中的所有Attribute,感觉内容偏多,所以分为两个篇幅来记录,篇幅内容过多的话,感觉不太适合阅读。 本篇记录包括以下内容: 基本导入导出(ExportAttribute、ImportAttribute) 导入导出的种类(ImportingConstructorAttribute、ImportManyAttribute) 导入和导出的继承(In...阅读全文

MEF核心笔记(2)Catalog的种类

2013-04-05 21:47 by Sun.M, 597 visits, 网摘收藏编辑
摘要: 一、内容回顾 清明时节雨纷纷啊,本打算回趟老家的,后来想想还是算了,人多,又下雨。闲话不多说了,上一篇中,我们了解了一些基本概念,如Export、Import、Catalog等,本篇就Catalog,进行更加深入的讲解。 二、框架中的Catalog 在MEF框架中,包含了4种Catalog,所有的Catalog的是从System.ComponentModel.Composition.Prim...阅读全文

MEF核心笔记(1)基础应用

2013-04-04 23:04 by Sun.M, 571 visits, 网摘收藏编辑
摘要: 从接触MEF到现在,已经有些年头了,虽然有些年头,但一直未在实际项目中使用,这可能是因为它的Framework框架太高,毕竟目前公司的主流项目都是用Framework 3.5。如此,冷落了它,有点可惜。最近可能会需要用到了,所以写一些笔记,来让自己熟悉起来。 题外话说一下,最近公司的小组里面一位成员要离开了,小组中也就我和他有对领域驱动设计有所研究,还没好好合作一次呢,也真是可惜。的确,这世间就...阅读全文

携手Delphi,保护我们的.NET程序

2013-03-23 15:43 by Sun.M, 3559 visits, 网摘收藏编辑
摘要: 大家都知道,对于用.NET开发的应用程序而言,是很容易被反编译的。如果我们的应用程序中有一些比较隐秘的东西(如注册算法),我们是很不希望被其它人知道的,所以我们需要保护自己写的.NET程序。 目前保护.NET应用程序主要还是靠混淆,并且也不乏一些很强大的混淆软件,本文主要是从另外一个方向下手,基于文件的保护,而不是代码层面的。 话不多说,我们从实际操作开始,边操作我会边解释为什么是基于文件的保...阅读全文

c# 调用金蝶登录,并解析PropsString

2012-08-13 16:39 by Sun.M, 122 visits, 网摘收藏编辑
摘要: 金蝶的登录界面,主要是COM技术,在.NET4.0之前,我们使用Reflection来调用,而.NET4.0之后,我们可以使用Dynamic特性来调用了。以下是使用.NET2.0来实现的,没有什么好说的,直接上代码,代码就是最好的说明,以下是我封装的一个类: using System;using System.Collections.Generic;using System.Text;using...阅读全文

c# 文字组合文字

2012-08-13 16:13 by Sun.M, 94 visits, 网摘收藏编辑
摘要: 这个标题很不好起,什么叫文字组合文字?通过下图就明白了: 可以看到,这个M是由很多“*”组成,这就是文字组合文字。 其实思路很简单,就是通过将需要产生的组合文字,先绘制到一个Bitmap中,然后通过判断Bitmap像素来组合我们需要的文字。请看以下很简略的代码: private Bitmap ConvertCharToBitmap(char c) { Bitma...阅读全文
 
分类: C#

从接触MEF到现在,已经有些年头了,虽然有些年头,但一直未在实际项目中使用,这可能是因为它的Framework框架太高,毕竟目前公司的主流项目都是用Framework 3.5。如此,冷落了它,有点可惜。最近可能会需要用到了,所以写一些笔记,来让自己熟悉起来。

题外话说一下,最近公司的小组里面一位成员要离开了,小组中也就我和他有对领域驱动设计有所研究,还没好好合作一次呢,也真是可惜。的确,这世间就是有太多的可惜,也许,哪天不如意了,我也会离开。当然,这一切都是题外话,偶尔的伤感和牢骚后,我们应该继续向前看,毕竟,向前看脖子才不酸(相比起仰视)。

废话不多说了,下面,我们进入正题吧。

  • MEF:Managed Extensibility Framework,.NET 4.0中带来的一个基于托管的扩展程序开发框架(挺拗口的,不过只是概念),另外通过强大的百度百科,我们发现MEF还是“小鼠胚胎成纤维细胞”的简称(这货是?)。
  • Contract:契约,即一种约定,具体在代码中表现为接口和抽象类。自从进入.NET 4.0,契约这个单词我们应该不会陌生,WCF中贯穿着各种契约,无论如何,契约就是一种约定。
  • Import:导入,导入契约的实现,说明此处需要一个实现的契约。
  • Export:导出,导出契约的实现,说明相应的类中实现了相应的契约。
  • Part:部件,即实现契约的类。
  • Catalog:目录(我是这样定义的),存放部件的地方,当需要某个部件时,会在目录中寻找。
  • Container:容器,存放目录并进行部件管理,如导出、导入等。
  • Compose:组装,通过容器在目录中寻找到实现了相应契约的部件,进行部件的组装。

二、框架图示

MEF
一、基本概念
二、框架图示
三、基本使用示例
四、总结

不是很会作图,上面的图就将就着看吧。一个Component Import了两个Contract,分别是Contract 1和Contract 2,一个Catalog中有两个Part并且Export了上诉的两个Contract,最后,Component通过Container的Compose操作,实例化了两个Contract。(我表述的不是很好,说的很拗口,但MEF是非常简单的框架,坚持看下去,你一定会学会的)

三、基本使用示例

下面到了动手操作的时候了,打开Visual Studio,新建一个.NET 4的控制台项目【MyMEFApplication】,添加对MEF库的引用,即“System.ComponentModel.Composition”。

1、添加一个契约

//这便是我们的契约 Contract
public interface ICalculator {

    int Add(int a, int b);

    int Sub(int a, int b);
}

2、实现这个契约

//此处我们导出了契约,这就是一个部件
   [Export(typeof(ICalculator))]
   public class MyCalculator : ICalculator {

       public int Add(int a, int b) {
           Console.WriteLine("Add Invoked");
           return a + b;
       }

       public int Sub(int a, int b) {
           Console.WriteLine("Sub Invoked");
           return a - b;
       }
   }

3、完成测试程序

class Program {

    private static CompositionContainer _container;

    static void Main(string[] args) {
        //AssemblyCatalog 目录的一种,表示在相应的程序集中搜索
        var catalog = new AssemblyCatalog(typeof(Program).Assembly);
        _container = new CompositionContainer(catalog);

        MathCompute mathCompute = new MathCompute();
        _container.ComposeParts(mathCompute);//组装部件

        Console.WriteLine(mathCompute.Add(1, 3));
        Console.WriteLine(mathCompute.Sub(3, 2));

        Console.ReadLine();
    }
}

public class MathCompute {

    //我们需要导入这个契约实现的部件
    [Import(typeof(ICalculator))]
    private ICalculator _calculator;


    public int Add(int a, int b) {
        return _calculator.Add(a, b);
    }

    public int Sub(int a, int b) {
        return _calculator.Sub(a, b);
    }

}

由于时间仓促,本次示例相当简单,并且无实际意义,接下来的实例,我会尽量弄些有实际意义的东西。

四、总结

本篇笔记中,我们大致的了解了MEF的使用,并且完成了一个很无聊的应用程序。我们熟知了什么是导入、导出,什么是契约、容器,这样就够了。

源码下载(请点击)