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

起因:工作需要针对不同类型的文件做不同的处理。打个比方,txt文件,直接打印,doc文件,直接发email,jpg文件,上传xxx相册站点。

其实这个问题在学习最基本的工厂模式的时候早已经解决了,稍有点面向对象基础的,都可以写出这样一个文件管理器。再有新类型文件处理的时候,只需要在加一个实现类,再在工厂里面加一个if判断,返回一个具体的处理实例即可,上层不必改动。

要干掉工厂里面的if,则必须要请出ioc容器了。MEF就是微软自家的托管可扩展框架,在这里被我用成了ioc容器,其他的功能,不求甚解。

我们先拿MEF练练手,再应用到具体的项目中。概念什么的先扔到一边。

新建一个控制台应用程序项目和一个类库项目,两个项目均引用MEF库。类库项目中新建三个类文件。

using System;
using System.ComponentModel.Composition;namespace Parts
{[Export(typeof(object))]//表示此类需要导出,导出的类型为objectpublic class TxtFileHandler{public void Process(){Console.WriteLine("处理文本文件");}}
}

其余的就不贴了,只是类名和输出语句不同。

主程序:

using System;
using System.ComponentModel.Composition.Hosting;namespace meftest
{class Program{//容器,装东西用的。具体装什么先不管。private static CompositionContainer container;static void Main(string[] args){//AssemblyCatalog 目录的一种,表示在程序集中搜索var assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);//此处这一句实际上没啥用,因为此程序集下没有任何我们需要的实例(各种handler)//在某个目录下的dll中搜索。var directoryCatalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory,"*.dll");var aggregateCatalog = new AggregateCatalog(assemblyCatalog, directoryCatalog);//创建搜索到的部件,放到容器中。container = new CompositionContainer(aggregateCatalog);        var exports = container.GetExports<object>();//获得所有导出的部件(object类型的)。foreach (var item in exports){Console.WriteLine(item.Value);}Console.ReadLine();}}
}

编译两个项目,将生成的类库文件Parts.dll拷贝到主程序的bin\debug文件夹

运行主程序:

可以看到,打印出了类名(object.ToString())。我们已经成功的创建了三个类的实例,但主程序并没有引用这个类库。

也可以说,我们将类的实例成功的注入到了主程序。

从这个小例子,我们可以学到,使用MEF三步骤:1、导出所需的类型(部件),2、在合适的目录(AssemblyCatalog、DirectoryCatalog)中查找。3、将找到的部件加入到容器。

之后你就可以使用容器中的已经New好的实例了。

注意:

在TxtFileHandler这个类上面的标记[Export(typeof(object))],表示此类需要导出,而且导出的类型为object

在main函数中,var exports = container.GetExports<object>();//获得所有导出的部件(object类型的)。

导出的类型和要获得的类型必须一致,这种一致性被称作为契约。

想进技术交流群的加微信zls20210502(可以扫描下方二维码),这里没有套路,没有广告,只为打造纯净的技术交流群,(想进群捣乱打广告的免加,会有技术考核,别白费心思

C# MEF入门讲解相关推荐

  1. 【直播】耿远昊:Pandas入门讲解(安泰第四届数据科学训练营)

    Pandas入门讲解 直播信息 主讲人:耿远昊,Datawhale成员,joyful-pandas作者. 直播时间:2021年04月07日 20:00~21:00 直播内容: 时间序列中的必知必会: ...

  2. 一看就明白的爬虫入门讲解:基础理论篇

    一看就明白的爬虫入门讲解:基础理论篇 发表于2015-11-13 18:50| 5909次阅读| 来源CSDN| 37 条评论| 作者孔淼 爬虫经验分享HTMLCSSAjaxApp网络 width=& ...

  3. 一看就明白的爬虫入门讲解-基础理论篇(下篇)

    文/孔淼 上篇我分享了爬虫入门中的"我们的目的是什么"."内容从何而来"."了解网络请求"这三部分的内容,这一篇我继续分享以下内容: 1) 一些常见的限制方式 2) 尝试解决问题的思路 3) 效率问题 ...

  4. 一看就明白的爬虫入门讲解-基础理论篇(上篇)

    作者:孔淼 关于爬虫内容的分享,我会分成两篇,六个部分来分享,分别是: 1)  我们的目的是什么 2)  内容从何而来 3)  了解网络请求 4)  一些常见的限制方式 5)  尝试解决问题的思路 6 ...

  5. JEECG_3.7.2新版本入门讲解—UI标签库专题-张代浩-专题视频课程

    JEECG_3.7.2新版本入门讲解-UI标签库专题-9741人已学习 课程介绍         JEECG_3.7.2新版本入门讲解-UI标签库专题(UI标签库的使用和二次开发实战) 课程收益    ...

  6. 每周四JEECG社区公开课:微信公众账号运营(jeewx使用)入门讲解

         JEECG即将推出免费公开课新专题,欢迎大家报名听课,共同交流!       课程名称:微信公众账号运营(jeewx使用)入门讲解       时        间:每周四晚九点       ...

  7. poj2104 k-th number 主席树入门讲解

    poj2104 k-th number 主席树入门讲解 定义:主席树是一种可持久化的线段树 又叫函数式线段树   刚开始学是不是觉得很蒙逼啊 其实我也是 主席树说简单了 就是 保留你每一步操作完成之后 ...

  8. CNN 入门讲解:什么是标准化?

    此文章首发于 卷积神经网络(CNN)入门讲解​zhuanlan.zhihu.com 内容如有修改,不在此处修改,请关注知乎:蒋竺波 ----------------------------分割线--- ...

  9. CNN 入门讲解:什么是全连接层

    新年第一更 祝大家新年快乐万事如意 这个时候还愿意点进来,新的一年肯定要起飞了 这情人节和新年连着过啊 这对情侣意味着什么,意味着要带情人去见家长了 当然对一些情侣意味着,情人节过不好,估计年也过不好 ...

最新文章

  1. 【机器学习知识体系】- 机器学习问题的一般流程
  2. NSOprationQueue 与 GCD 的区别与选用
  3. 感谢有你 WebRTCon 2018优秀出品人、讲师与志愿者
  4. python跳转到程序顶部_python-如何使Tkinter窗口跳到最前面?
  5. libjpeg: cannot open
  6. 如何在Java中使ArrayList只读?
  7. 00058 imp_IMP-00058: ORACLE error 12154 encountered
  8. 机器学习(深度学习)通用工作流程
  9. Windows8.1下安装NoSQL-- mongodb安装使用
  10. mybatis plus 入门
  11. SVN安装与使用教程
  12. 【Android应用开发】 推送原理解析 极光推送使用详解 (零基础精通推送)
  13. 计算DSP程序运行时间
  14. ccd后视摄像头_20192020年车载摄像头产业报告
  15. qmainwindow 标题栏_Qt:自定义标题栏(QMainWindow)
  16. java 缓存的简单实现
  17. 自学Python第二十二天- Django框架(一)创建项目、APP、快速上手、请求和响应流程、模板、数据库操作
  18. C# Redis使用及帮助类
  19. jdbc驱动安装以及简单测试
  20. 浏览器上享受《速度与激情》,开发者花 16 个月用 JavaScript 造了一款驾驶游戏,水里也能开车!

热门文章

  1. 《智能制造时代的研发智慧:知识工程2.0》一第1章 知识工程2.0的产生背景
  2. linux打开微软RMS文档,RMS服务证书到期导致打开XPS文档出现“无法打开此受保护的文档”...
  3. 10个JS精简代码无形装逼集合,最为致命
  4. 如何将MIke的结果转成Tecplot格式--基于python
  5. 直纹面叶轮逆向造型--修改叶片,NREC可直接线铣编程
  6. 麒麟子Cocos Creator 3D研究笔记一:图片资源类型和加载
  7. 杂项-公司:软银银行集团
  8. qt实现撤销和恢复功能
  9. 用U盘在MacBook上安装Win7
  10. L3-021 神坛 (30分)