写在前面:下面学习所得多是从自http://www.cnblogs.com/comsokey/p/MEF1.htmlhttp://www.cnblogs.com/yunfeifei/p/3922668.html两位大神的文章里学到的,特别鸣谢!整理下是更大一方面是对自己知识的梳理,用词用句不够准确,见谅,看不懂的可自行参考两位大神的原文。

一.定义和特性

  定义:MEF=Managered Extensibility Framework.

  特性:减少代码耦合度,利用封装代码轻松搞定工程。

  我的理解:利用Export与Import相协作,让系统自动匹配需要。

  本文实例在后面有下载,内部各代码都有解释,不懂的可以下载看看。

二.实例说话

  1.定义接口

  1. namespace MEFMovie
  2. {
  3. public interface Data
  4. {
  5. string Name { get; set; }
  6. string Type { get; set; }
  7. string TimeOut { get; set; }
  8.  
  9. string GetMovie();
  10. }
  11. }

  定义interface接口为后面需要继承的类做准备

  2.数据类设置

  1. namespace MEFMovie
  2. {
  3. [Export("HorribleMovie", typeof(Data))]
  4. public class HorribleMovie : Data
  5. {
  6. public string Name { get; set; }
  7. public string Type { get; set; }
  8. public string TimeOut { get; set; }
  9.  
  10. public string GetMovie()
  11. {
  12. Name = "11111";
  13. return "HorribleMovie";
  14. }
  15.  
  16. }
  17.  
  18. [Export(typeof(Data))]
  19. [ExportMetadata("obj","00000")]
  20. public class LoveMovie : Data
  21. {
  22. [Export(typeof(string))]
  23. public string MovieAct01 = "周杰伦";
  24.  
  25. [Export(typeof(string))]
  26. public string MovieAct02 = "周润发";
  27.  
  28. [Export(typeof(string))]
  29. public string MovieAct03 = "周星驰";
  30.  
  31. public string Name { get; set; }
  32. public string Type { get; set; }
  33. public string TimeOut { get; set; }
  34.  
  35. public string GetMovie()
  36. {
  37. return "LoveMovie";
  38. }
  1. }
  2.  
  3. [Export("ComedyMovie", typeof(Data))]
  4. [ExportMetadata("obj", "222222")]
  5. public class ComedyMovie : Data
  6. {
  7. public string Name { get; set; }
  8. public string Type { get; set; }
  9. public string TimeOut { get; set; }
  10.  
  11. public string GetMovie()
  12. {
  13. return "ComedyMovie";
  14. }
  15. }
  16. }

在继承时需要把接口相应的属性和方法完整写出来(Name,Type,TimeOut和GetMovie)

Export为导出该继承类的数据,在使用时请先引用

Export格式为[Export("XXX",TypeOf(XX))]

其中"XXX"是契约名,这是为了在继承类很多时,方便寻找需要的类,契约名可以不写,[Export(TypeOf(XX))]。

TypeOf(XX)是指导出类型,XX一般是类继承的接口

上述三个类分别用了三种导出方式:

1.HorribleMovie:[Export("HorribleMovie", typeof(Data))]

2.LoveMovie:[Export(typeof(Data))]

3.ComedyMovie:[Export("ComedyMovie", typeof(Data))]

这是博主在疑问Export的使用格式时做的N多无用测试,有疑问的可以继续试试

  3.辅助插件

  1. public interface OtherMate
  2. {
  3. string obj { get; }
  4. }

  后面会做解释

  4.数据显示

  1. namespace MEFMovie
  2. {
  3. public class DataManager
  4. {
  5. public string Act { get; set; }

  6.     //对应[Export("HorribleMovie", typeof(Data))]导出内容
  7. [Import("HorribleMovie")]
  8. Data HorribleMovieData;
  9.  
  10. //导入多个继承接口Data的类
  11. [ImportMany(typeof(Data))]
  12. public IEnumerable<Data> datass { get; set; }
  13.  
  14. [ImportMany(typeof(Data))]
  15. public IEnumerable<Lazy<Data, OtherMate>> data { get; set; }
  16.  
  17. //对应导出 [Export("ComedyMovie", typeof(Data))]
  18. [Import("ComedyMovie")]
  19. Data ComedyMovie { get; set; }
  20.  
  21. //对应所有 [Export(typeof(string))]
  22. [ImportMany(typeof(string))]
  23. public List<string> MovieActs { get; set; }
  24.  
  25. //程序启动时,做下列动作
  26. public void Open()
  27. {
  28. //找到所有文件下的dll程序集(只有这样才能找到Datas下的各个数据类)
  29. //注意引用:using System.ComponentModel.Composition;
  30. //using System.ComponentModel.Composition.Hosting;
  31. var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
  32. var container = new CompositionContainer(catalog);
  33. container.ComposeParts(this);
  34.  
  35. //下面是对数据做出显示,方便辩证程序是否成功
  36.  
  37. //对导入的string类型数据做遍历 并显示
  38. foreach (var ss in MovieActs)
  39. {
  40. Act += ss;
  41. }
  42.  
  43. //对导入HorribleMovie做辩证
  44. Act += HorribleMovieData.GetMovie();
  45. //对导入的ComedyMovie做辩证
  46. Act += ComedyMovie.GetMovie();

  47. //对接口的属性做辩证 前面赋值"11111"
  48. Act += HorribleMovieData.Name;
  49.  
  50. //辅助插件的作用:在这个程序里是对数据做筛选
  51. foreach (var s in data.Where(item => item.Metadata.obj == reds()))
  52. {
  53. Act += s.Metadata;
  54. }
  55. }
  56. //筛选标准
  57. private string reds()
  58. {
  59. string s = "00000";
  60. return s;
  61. }
  62. }

上面各Import是对导出的Export做导入

ImportMany是指导入多个,它后面的TpyeOf可以省略不写,ImportMany即可。

public IEnumerable<Lazy<Data, OtherMate>> data { get; set; } 是用辅助插件做筛选,后续调用item.metadata.obj做比较得出结果。

5.示例下载

用WPF做关于MEF 简单学习记录的更多相关文章

  1. Linux命令行及Vim简单学习记录

    Linux命令行 1.打开命令行 Ctrl+Alt+t 2.目录 显示当前目录的文件列表 ls 跳转至当前目录中的x文件夹 cd x 返回根目录 cd 3.文件 新建文件1.cpp touch ./1 ...

  2. Linux awk工具简单学习记录

    awk是一个文本分析工具,它把文件逐行读入,以特定符号将每行切分(默认空格为分隔符),切开的部分再进行各种分析处理. awk其名称得自于它的创始人Alfred Aho .Peter Weinberge ...

  3. wpf 全局异常捕捉+简单日志记录

    `namespace MyApp { /// /// App.xaml 的交互逻辑 /// public partial class App : Application { public App() ...

  4. Settings app简单学习记录

    Settings是android系统设置的入口.主界面由Settings.java以及settings_headers.xml构成. Settings类继承自PreferenceActivity,而P ...

  5. redis的简单学习记录

    安装 1 brew install redis 启动redis服务 1 redis-server & 启动命令 1 redis-cli -h 127.0.0.1 -p 6379 利用gored ...

  6. MyBatis 学习记录3 MapperMethod类

    主题 之前学习了一下MapperProxy的生产过程,自定义Mapper类的对象是通过动态代理生产的,调用自定义方法的时候实际上是调用了MapperMethod的execute方法:mapperMet ...

  7. zeromq学习记录(一)最初的简单示例使用ZMQ_REQ ZMQ_REP

    阅读zeromq guide的一些学习记录 zeromq官方例子 在VC下运行会有些跨平台的错误 我这里有做修改 稍后会发布出来 相关的代码与库  http://download.zeromq.org ...

  8. Delphi中,indy控件实现收发邮件的几点学习记录( 可以考虑加入多线程,用多个邮箱做一个邮箱群发器) 转

    关于用Delphi中的Indy控件实现收发邮件的几点学习记录             这几天心里颇不宁静,不是因为项目延期,而是因为自己几个月前做的邮件发送程序至今无任何进展,虽然一向谦虚的人在网上发 ...

  9. git原理学习记录:从基本指令到背后原理,实现一个简单的git

    一开始我还担心 git 的原理会不会很难懂,但在阅读了官方文档后我发现其实并不难懂,似乎可以动手实现一个简单的 git,于是就有了下面这篇学习记录. 本文的叙述思路参照了官方文档Book的原理介绍部分 ...

随机推荐

  1. VMWare虚拟机Centos 6.9中的 linux 配置静态ip地址上外网

    1.查看网络 # ifconfig 发现网络还没有配置,ping不通 2.修改网卡配置文件 # vim /etc/sysconfig/network-scripts/ifcfg-eth0 添加如下配置 ...

  2. Hadoop2.6.5高可用集群搭建

    软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3, m4, m5这五部机, 每部主机的用户名 ...

  3. IIS7部署网站的一些细节问题。

    1.不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况. 这个错误的原因是在 IIS 7中 采用了更安全的 web.config 管理机制,默认情况下会锁住配置项.要取消锁定可以以 ...

  4. day35-1 类的三大特性---继承,以及类的派生

    目录 类的继承 继承的特性 类的派生 类的组合 类的继承 继承是为了拿到父类的所有东西 继承的特性 减少代码的冗余 Python中父类和子类的对应关系是多对多 使用__bases__方法获取对象继承的 ...

  5. STM32F103 rtthread工程构建

    目录 STM32F103 工程构建 1.基本情况 2.硬件连接 3.rtthread配置 4.点灯 5. 码云上git操作 STM32F103 工程构建 1.基本情况 RAM 20K ROM 64K ...

  6. C#第七节课

    for嵌套 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System ...

  7. 域名IP绑定

    该文为阿里云域名举例 首先具备3个前提: 买服务器并搭建环境:阿里云官网购买阿里云的服务器(我购买的是window系统,ECS服务器). 在自己的云服务器上布置上jdk,配置环境变量:安装上tomca ...

  8. Problem 22

    Problem 22 Using names.txt (https://projecteuler.net/problem=22)(right click and 'Save Link/Target A ...

  9. CentOS 7 x64下Apache+MySQL(Mariadb)+PHP5.6的安装

    每次搭建新服务器,都要来来回回把这些包再装一下,来来回回搞了不下20遍了吧,原来都是凭经验,配置过程中重复入坑是难免的,故写此文做个备忘.虽然有像xampp这样的集成包,但是在生产环境的Linux发行 ...

  10. kettle 递归循环

    var i = new Number(parent_job.getVariable(; parent_job.setVariable("i",i); true;