我们已经成功的达到了目标,大量减少了if else。

不过在园子里面的文章大多,用的是Import、ImportMany。So,修改主函数。

using IPart;
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Linq;namespace meftest
{class Program{[ImportMany]private IEnumerable<Lazy<IFileHandler, IPatMetadata>> fileHandlers;//警告,说没有赋值过。不用理会,MEF会自己导入的。static void Main(string[] args){//模拟数据。string[] files = new string[] {@"c:\xxoo\xxoo.txt",@"c:\xxoo\ooxx.doc",@"d:\测试目录\mm.jpg",@"e:\电影\天海翼.avi",};Program p = new Program();p.Compose();foreach (var file in files){string ext = System.IO.Path.GetExtension(file).ToLower();var export = p.fileHandlers.SingleOrDefault(o => o.Metadata.Extension == ext);//根据扩展名,也就是元数据来找到对应的处理实例if (export != null)export.Value.Process(file);}Console.ReadLine();}private void Compose(){//AssemblyCatalog 目录的一种,表示在程序集中搜索var assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);//此处这一句实际上没啥用,因为此程序集下没有任何我们需要的实例(各种handler)//在某个目录下的dll中搜索。var directoryCatalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory, "*.dll");var aggregateCatalog = new AggregateCatalog(assemblyCatalog, directoryCatalog);//聚合目录包含有2种搜索方式var container = new CompositionContainer(aggregateCatalog);container.ComposeParts(this);//将部件组合在一起。意思就是将所有Export的部件,装配到this实例中标记为Import、ImportMany的属性上。
        }}
}

不过这里有一个要注意的地方,不能在主函数内部来进行装配。原因如下图。

运行结果:

ok,现在MEF你已经入门了,再看大神们的文章心里也有点底了。本系列到此结束。

转载于:https://www.cnblogs.com/luhuanong/p/5541581.html

MEF入门之不求甚解,但力求简单能讲明白(五)相关推荐

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

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

  2. C# MEF入门讲解

    MEF入门之不求甚解,但力求简单能讲明白(一) 起因:工作需要针对不同类型的文件做不同的处理.打个比方,txt文件,直接打印,doc文件,直接发email,jpg文件,上传xxx相册站点. 其实这个问 ...

  3. WF4.0入门系列1——创建一个简单的工作流

    WF4.0入门系列1--创建一个简单的工作流 打开VS2010,选择文件-新建-项目,选择Workflow项 工作流台应用程序,在名称处输入chapter01,选择合适的位置,这里默认,单击确定. V ...

  4. C语言中怎么用循环统计买法,C语言入门谭浩强版简单选择法冒泡法用数组和for循环进行学生成绩简单统计处理...

    C语言入门谭浩强版 简单选择法排序 冒泡法排序 用数组和for循环进行学生成绩简单统计处理 例如:求个人平均分 学科平均分 单科最高分等 简单选择法 #include #define N 10 voi ...

  5. 【Yocto学习入门】02 - 构建一个简单的Poky参考嵌入式操作系统

    [Yocto学习入门]02 - 构建一个简单的Poky参考嵌入式操作系统 一.开发环境准备 二.下载 Poky 代码 三.配置编译环境 3.1 下载失败情况处理 Failed to fetch URL ...

  6. 【深度学习入门基础】二、简单理解 Transformer

    [深度学习入门基础]二.简单理解 Transformer 文章目录 [深度学习入门基础]二.简单理解 Transformer 自注意力层 多头注意力 Transformer 输入(输出)嵌入 位置编码 ...

  7. 【前端实例代码】Html5+css3创建拟物风格昏昏欲睡的云朵动画网页效果~前端开发网页设计基础入门教程~适合初学者~超简单~

    b站视频演示效果: [前端实例代码]Html5+css3创建拟物风格昏昏欲睡的云朵动画网页效果!前端开发网页设计基础入门教程!适合初学者~超简单~ 效果图: 完整代码: <!DOCTYPE ht ...

  8. 编程语言用Python实现九九乘法表的几种方式,入门必备案例!超级简单!

    编程语言用Python实现九九乘法表的几种方式,入门必备案例!超级简单! 我们在学习Python的过程中需要不断的积累和练习,这样才能够走的更远,今天一起来学习怎么用Python写九九乘法表~ 第一种 ...

  9. java etl工具_一文带你入门ETL工具-datax的简单使用

    什么是ETL? ETL负责将分布的.异构数据源中的数据如关系数据.平面数据文件等抽取到临时中间层后进行清洗.转换.集成,最后加载到数据仓库或数据集市中,成为联机分析处理.数据挖掘的基础. ETL是数据 ...

最新文章

  1. 与有利集团总公司,同携手•共辉煌
  2. [C# 网络编程系列]专题十一:实现一个基于FTP协议的程序——文件上传下载器...
  3. iOS万能跳转界面的方法
  4. 如何用ABAP读取LRAW中的数据
  5. eclipse maven 构建简单springmvc项目
  6. web前端网页开发离不开的三要素:HTML、CSS、JavaScript
  7. PS如何制作酷炫个性字母人像海报
  8. php格式转为jpg格式,如何在PHP中将所有图像转换为JPG格式?
  9. mysql对所有id求积_MySQL学习笔记(二)—查询
  10. 真狠,为了干掉 HTTP ,Spring团队又开源nohttp了!
  11. python电力系统暂态分析_电力系统暂态计算——时域仿真方法
  12. 武汉晴川学院计算机,2019武汉晴川学院专业排名
  13. FYI | OHBM/Brain 会议投稿指北
  14. elementUI el-upload使用方法、上传限制数量且超出不显示上传按钮、删除闪一下、多个upload并排显示
  15. ARM开发工具历史及分类详解 (最详尽的区分和介绍ARM DS-5,RVD...
  16. scons构建mdk工程
  17. php 根据父级id查出,php,_三级分类 like查询 查询到很多id 需要找到对应的父级id 并根据父级id组合 应该怎么根据父级id将数据组合在一起呢?,php - phpStudy...
  18. 使用爬虫获取四川省各市的降雨量
  19. 游戏史上30位最有影响力的人
  20. JavaScript学习(十八)--鼠标事件(鼠标点击松开移动效果)

热门文章

  1. 智慧云安全数据防护平台介绍
  2. 人工智能ai应用高管指南_营销商关于AI的完整指南
  3. 孩子为什么要从小学习编程?
  4. 用“小聪明”实现连续爬取谷歌翻译
  5. 与孩童家长的一段奇异的对话:父母视觉正常,孩子却患色盲
  6. java生成兑换码礼包码
  7. 计算机的广义定义和狭义定义,电子商务应有,广义的定义和狭义的定义之分
  8. 数据库系统概论练习5
  9. 手机号——三大运营商的号段分配
  10. 万能计算机作文,万能机器人作文(共6篇)