在上一篇文章中,我们已经学到了很基本的MEF概念和使用方法。

但我们导出的是一个object类型的实例,只能用来tostring,没有引用部件类库,也不能用里面的成员方法。

本篇,我们逐渐往简单的文件管理器的目标靠拢。

新建类库IPart,添加一个接口IFileHandler.cs

  1. namespace IPart
  2. {
  3. public interface IFileHandler
  4. {
  5. void Process();
  6. }
  7. }

Parts类库和主项目meftest均引用IPart

Parts类库中,将要导出的类型改为IFileHandler,类实现IFileHandler

以其中一个为例。

  1. using IPart;
  2. using System;
  3. using System.ComponentModel.Composition;
  4.  
  5. namespace Parts
  6. {
  7. [Export(typeof(IFileHandler))]//表示此类需要导出,导出的类型为IFileHandler
  8. public class TxtFileHandler: IFileHandler
  9. {
  10. public void Process()
  11. {
  12. Console.WriteLine("处理文本文件");
  13. }
  14. }
  15. }

主项目:

  1. using IPart;
  2. using System;
  3. using System.ComponentModel.Composition.Hosting;
  4.  
  5. namespace meftest
  6. {
  7. class Program
  8. {
  9. //容器,装东西用的。具体装什么先不管。
  10. private static CompositionContainer container;
  11. static void Main(string[] args)
  12. {
  13. //AssemblyCatalog 目录的一种,表示在程序集中搜索
  14. var assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);//此处这一句实际上没啥用,因为此程序集下没有任何我们需要的实例(各种handler)
  15. //在某个目录下的dll中搜索。
  16. var directoryCatalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory,"*.dll");
  17. var aggregateCatalog = new AggregateCatalog(assemblyCatalog, directoryCatalog);
  18.  
  19. //创建搜索到的部件,放到容器中。
  20. container = new CompositionContainer(aggregateCatalog);
  21. var exports = container.GetExports<IFileHandler>();//获得所有导出的部件(IFileHandler类型的)。
  22. foreach (var item in exports)
  23. {
  24. item.Value.Process();//此处已经可以调用IFileHandler.Process()了
  25. }
  26. Console.ReadLine();
  27. }
  28. }
  29. }

编译后,别忘了把Parts.dll拷贝到主程序的bin\debug下。

运行:

我们已经把所有IHandler类型的实例创建出来了,并且运行了其中的成员函数。

最恨天下文章一大抄,请不要转载。

MEF入门之不求甚解,但力求简单能讲明白(二)的更多相关文章

  1. MEF入门之不求甚解,但力求简单能讲明白(四)

    上一篇我们已经可以获取各种FileHandler的实例和对应的元数据.本篇,我们做一个稍微完整的文件管理器. 1.修改接口IFileHandler,传入文件名 namespace IPart { pu ...

  2. MEF入门之不求甚解,但力求简单能讲明白(五)

    我们已经成功的达到了目标,大量减少了if else. 不过在园子里面的文章大多,用的是Import.ImportMany.So,修改主函数. using IPart; using System; us ...

  3. MEF入门之不求甚解,但力求简单能讲明白(一)

    起因:工作需要针对不同类型的文件做不同的处理.打个比方,txt文件,直接打印,doc文件,直接发email,jpg文件,上传xxx相册站点. 其实这个问题在学习最基本的工厂模式的时候早已经解决了,稍有 ...

  4. MEF入门之不求甚解,但力求简单能讲明白(三)

    上一篇我们已经获得了制定类型的实例,但我们还无法对其进行有效的控制. 我们用ExportMetadata属性可以对具体的某个实例做标记,相当于命名.这么理解不知道对否. 在IPart项目中添加一个接口 ...

  5. 『NiFi 学习之路』入门 —— 下载、安装与简单使用

    一.概述 "光说不练假把式." 官网上的介绍多少让人迷迷糊糊的,各种高大上的词语仿佛让 NiFi 离我们越来越远. 实践是最好的老师.那就让我们试用一下 NiFi 吧! 二.安装 ...

  6. 【转载】salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建

    salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建   VisualForce封装了很多的标签用来进行页面设计,本篇主要讲述简单的页面增删改查.使用的内容和设计到前台页面使用的 ...

  7. react入门之使用react-bootstrap当轮子造车(二)

    react入门之使用react-bootstrap当轮子造车(二) 上一篇我们谈了谈如何配置react的webpack环境 react入门之搭配环境(一) 可能很多人已经打开过官方文档学习了react ...

  8. [原创]linux简单之美(二)

    原文链接:linux简单之美(二) 我们在前一章中看到了如何仅仅用syscall做一些简单的事,现在我们看能不能直接调用C标准库中的函数快速做一些"复杂"的事: section . ...

  9. keras实现简单性别识别(二分类问题)

    keras实现简单性别识别(二分类问题) 第一步:准备好需要的库 tensorflow  1.4.0 h5py 2.7.0 hdf5 1.8.15.1 Keras     2.0.8 opencv-p ...

随机推荐

  1. 达洛克战记3 即将开服! What's New!

    历经数个月的开发,达洛克战记3即将全新开服! 剧情: 回归到三大种族起源时期,三大种族并没有像现在三足鼎立.人类一直处于统治地位.但是突然间一群巨人的出现,让人类损失惨重,身为勇者,需要探索巨人背后的 ...

  2. Lucene系列-分析器

    分析器介绍 搜索的基础是对文本信息进行分析,Lucene的分析工具在org.apache.lucene.analysis包中.分析器负责对文本进行分词.语言处理得到词条,建索引和搜索的时候都需要用到分 ...

  3. Spring MVC 1

    ==============================  摘抄至<跟我学SpringMVC.pdf>  =========================== 1.首先用户发送请求— ...

  4. Thrift架构~从图中理解thrift,它事实上是一种远程过程调用

    thrift为我们简化了tcp通讯,它可以使用我们方便的建立各种语言的服务端与客户端,并实现客户端对服务器的远程过程调用,简单的说就是服务器通过thrift架构对外开放一些接口,并自己实现这些接口,如 ...

  5. 04- Shell脚本学习--条件控制和循环语句

    条件判断:if语句 语法格式: if [ expression ] then Statement(s) to be executed if expression is true fi 注意:expre ...

  6. Oracle Redo 以及 Archived日志简述

    Oracle通过Redo Archived实现数据的归档 什么是Redo日志 Redo日志记录了数据的变更,用于在数据库出现故障后,进行数据恢复. 功能主要由三个组件实现:Redo Log Buffe ...

  7. [Java面试九]脚本语言知识总结.

    核心内容概述 1.JavaScript加强,涉及到ECMAScript语法.BOM对象.DOM对象以及事件. 2.Ajax传统编程. 3.jQuery框架,九种选择器为核心学习内容 4.JQuery ...

  8. Jquery 选择器 详解

    在线文档地址:http://tool.oschina.net/apidocs/apidoc?api=jquery 各种在线工具地址:http://www.ostools.net/ 一.基本选择器 $( ...

  9. 每天一个linux命令(61):vi命令 /企业常用的linux命令清单

    vi/vim 的使用 基本上 vi/vim 共分为三种模式,分别是一般模式.编辑模式与指令列命令模式. 这三种模式的作用分别是: 一般模式:以 vi 打开一个档案就直接进入一般模式了(这是默认的模式) ...

  10. CCNA学习 NAT网络地址转换

    CCNA基础 NAT网络地址转换 在计算机网络中,网络地址转换(Network Address Translation,缩写为NAT),也叫做网络掩蔽或者IP掩蔽(IP masquerading),是 ...