MEF 的精髓在于插件式开发,方便扩展。

我学东西,习惯性的先搞的最简单的Demo出来,看看有没有好玩的东东,然后继续深入。这个博文,不谈大道理,看demo说事儿。

至于概念,请google ,大把大把的。

例如,应用程序的日志输出到文本,后来想改为输出到数据库,按照传统的办法,需要替换项目,删除原有的引用,增加新的引用;如果使用MEF,直接用新的dll替换原来的dll,即可搞定,这就是MEF的魅力。

下面就用简单的例子来实现上述的需求。

1. 建立一个解决方案,然后增加如下的几个项目

Dblog 输出日志到数据库的实现

TextLog 输出日志到文本的实现

Ilog 输出日志的接口,调用方和实现者的中间桥梁

MEFConsoleHost 控制台应用程序,模拟实用场合

MEFWPFHost WPF 应用程序,模拟实用场合

2. 先定义接口Ilog,非常简单,就一个方法

3.  输出到文本的实现TextLog

首先添加引用:引用刚才添加的接口Ilog 和System.ComponentModel.Composition

然后增加类TextLogService.cs,继承接口,并实现方法。

注意 类和方法都Public。

最后定义导出[Export(typeof(ILog.ILogService))]

这个是最主要的,和普通的类库区别也在这里

4. 输出到数据库的实现DbLog,实现方法同上例,输出日志的时候区分一下。

5. 调用方MEFConsoleHost, 这个也需要增加两个引用,

Ilog 和System.ComponentModel.Composition

主程序代码如下:

class Program

    {

        [Import(typeof(ILogService))]

        public ILogService CurrentLogService { get; set; }

        static void Main(string[] args)

        {

            Program pro = new Program();

            pro.Run();

        }

        void Run()

        {

            //var catalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory,"DbLog.dll");

            var catalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory, "TextLog.dll");

            var container = new CompositionContainer(catalog);

            container.ComposeParts(this);

            CurrentLogService.Log("MEF Log Test Pass");

            Console.Read();

        }

    }

注意两个地方

a. 导入声明

[Import(typeof(ILogService))]
public ILogService CurrentLogService { get; set; }

用接口来定义实例,然后增加导入声明,和导出的相互对应

b. 建立Catalog和Container

var catalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory, "TextLog.dll");
var container = new CompositionContainer(catalog);
container.ComposeParts(this);

先这么写,随后再深入挖掘。

6. 把所有项目的输出都指定到同一个目录,也就说让dll和exe在同一目录,运行控制台程序,输出

TextLog: MEF Log Test Pass

7.如果我们要输出到数据库,把上面的catalog那一句改成

var catalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory,"DbLog.dll");

如果不想这么麻烦,这个目录里面只放DbLog.dll 或者TextLog.dll ,然后把上面那句改为:

var catalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory);

照样可以用。

如果两个都在,还这么搞,那不行的,因为就定义了一个实例,同目录有两个dll。

好了,入门的Demo就到这里。

可以延伸开来,触类旁通,继续深入研究其他概念,例如其他的Catalog\Export等。

[MEF] 学习之一 入门级的简单Demo(转)的更多相关文章

  1. [MEF] 学习之一 入门级的简单Demo

    MEF 的精髓在于插件式开发,方便扩展. 我学东西,习惯性的先搞的最简单的Demo出来,看看有没有好玩的东东,然后继续深入.这个博文,不谈大道理,看demo说事儿. 至于概念,请google ,大把大 ...

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

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

  3. PHP多进程学习(一)__来初步了解一下PHP多进程及简单demo

    php是一门单进程弱类型的语言,PHP处理多并发主要是依赖服务器或PHP-FPM的多进程及它们进程的复用,多进程的作用优点大家可以去网上了解,PHP实现多进程在实际项目中意义也是不容小觑的.比如:日常 ...

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

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

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

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

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

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

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

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

  8. C#可扩展编程之MEF学习

    MEF系列文章: C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import) C#可扩展编程之MEF学习 ...

  9. [转]MEF学习

    MEF学习 :http://www.cnblogs.com/comsokey/p/MEF1.html C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo C#可扩展编程之MEF学习笔记( ...

随机推荐

  1. MVC后台的几种跳转方法

    //当服务器执行到Response.Redirect语句时,会立即中断页面的生命周期,直接向客户端返回信息,让客户端进行重定向操作.302(暂时重定向) Response.Redirect(" ...

  2. 创建一个最简单的SpringBoot应用

    已经来实习了一段时间了,从开始接触到SpringBoot框架到现在一直都感觉SpringBoot框架实在是为我们带来了巨大遍历之处,之前一直在用并没有总结一下,现在有空从零开始写点东西,也算是对基础的 ...

  3. 使用 C++ 多态时需要注意的问题

    本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/ 最近工作中遇到一些关于使用多态的细节问题,在此记录一下. 一.多态和模板匹配 模板是 C+ ...

  4. 73条日常Linux shell命令汇总

    1.检查远程端口是否对bash开放: echo >/dev/tcp/8.8.8.8/53 && echo "open" 2.让进程转入后台: Ctrl + z ...

  5. 【Html 学习笔记】第五节——表格

    表格也是日常用到的. 普通表格:<table> 表格边框:border 表头:th 表格标题:caption 横/纵向合并的单元格:colspan .rawspan 表格内标签: 单元格间 ...

  6. 淘宝TDDL配置以及使用

    此章节具体介绍一下淘宝TDDL具体配置和使用 1. Spring配置文件配置:================spring-mybatis.xml 中配置============= <bean ...

  7. nodejs之log4js日志记录模块简单配置使用

    在我的一个node express项目中,使用了log4js来生成日志并且保存到文件里,生成的文件如下: 文件名字叫:access.log 如果在配置log4js的时候允许了同时存在多个备份log文件 ...

  8. CocoaPods Mac App的安装和使用

    CocoaPods桌面应用版下载地址:https://cocoapods.org/app打开应用会提示你是否安装命令行工具,选择install就也可以在命令行使用Pod了.省去了上面的步骤们,方便快捷 ...

  9. Django中构造响应对象的方式

    1 HttpResponse 可以使用django.http.HttpResponse来构造响应对象. HttpResponse(content=响应体, content_type=响应体数据类型, ...

  10. Ubuntu下sh *.sh使用==操作符执行报错

    ----<鸟哥的Linux私房菜--基础篇>学习笔记 ubuntu默认的sh是连接到dash,而我们写shell脚本时使用的时bash.bash和dash在一些方面是不兼容的.因此执行同一 ...