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

一.定义和特性

  定义:MEF=Managered Extensibility Framework.

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

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

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

二.实例说话

  1.定义接口

namespace MEFMovie
{
public interface Data
{
string Name { get; set; }
string Type { get; set; }
string TimeOut { get; set; } string GetMovie();
}
}

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

  2.数据类设置

namespace MEFMovie
{
[Export("HorribleMovie", typeof(Data))]
public class HorribleMovie : Data
{
public string Name { get; set; }
public string Type { get; set; }
public string TimeOut { get; set; } public string GetMovie()
{
Name = "11111";
return "HorribleMovie";
} } [Export(typeof(Data))]
[ExportMetadata("obj","00000")]
public class LoveMovie : Data
{
[Export(typeof(string))]
public string MovieAct01 = "周杰伦"; [Export(typeof(string))]
public string MovieAct02 = "周润发"; [Export(typeof(string))]
public string MovieAct03 = "周星驰"; public string Name { get; set; }
public string Type { get; set; }
public string TimeOut { get; set; } public string GetMovie()
{
return "LoveMovie";
}
    }

    [Export("ComedyMovie", typeof(Data))]
[ExportMetadata("obj", "222222")]
public class ComedyMovie : Data
{
public string Name { get; set; }
public string Type { get; set; }
public string TimeOut { get; set; } public string GetMovie()
{
return "ComedyMovie";
}
}
}

在继承时需要把接口相应的属性和方法完整写出来(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.辅助插件

 public interface OtherMate
{
string obj { get; }
}

  后面会做解释

  4.数据显示

namespace MEFMovie
{
public class DataManager
{
public string Act { get; set; }

    //对应[Export("HorribleMovie", typeof(Data))]导出内容
[Import("HorribleMovie")]
Data HorribleMovieData; //导入多个继承接口Data的类
[ImportMany(typeof(Data))]
public IEnumerable<Data> datass { get; set; } [ImportMany(typeof(Data))]
public IEnumerable<Lazy<Data, OtherMate>> data { get; set; } //对应导出 [Export("ComedyMovie", typeof(Data))]
[Import("ComedyMovie")]
Data ComedyMovie { get; set; } //对应所有 [Export(typeof(string))]
[ImportMany(typeof(string))]
public List<string> MovieActs { get; set; } //程序启动时,做下列动作
public void Open()
{
//找到所有文件下的dll程序集(只有这样才能找到Datas下的各个数据类)
//注意引用:using System.ComponentModel.Composition;
//using System.ComponentModel.Composition.Hosting;
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
container.ComposeParts(this); //下面是对数据做出显示,方便辩证程序是否成功 //对导入的string类型数据做遍历 并显示
foreach (var ss in MovieActs)
{
Act += ss;
} //对导入HorribleMovie做辩证
Act += HorribleMovieData.GetMovie();
//对导入的ComedyMovie做辩证
Act += ComedyMovie.GetMovie();

//对接口的属性做辩证 前面赋值"11111"
Act += HorribleMovieData.Name; //辅助插件的作用:在这个程序里是对数据做筛选
foreach (var s in data.Where(item => item.Metadata.obj == reds()))
{
Act += s.Metadata;
}
}
//筛选标准
private string reds()
{
string s = "00000";
return s;
}
}

上面各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. XML、集合、JSP综合练习

    一.利用DOM解析XML文件得到信息:存入泛型集合中在JSP页面循环打印读取的信息 a)         编写XML文件:添加测试节点数据 b)         建立web项目:在JSP页面中使用DO ...

  2. @dalao help!!!

  3. CentOS 7.2 安装Python3.5.2

    系统环境: CentOS 7.2 x86_64 安装相关包 (1)# yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sq ...

  4. sql server备份策略

    https://www.cnblogs.com/fengzongming/archive/2018/08/29/9530616.html

  5. 08.Web服务器-1.浏览器访问服务器显示页面的网络模型步骤解析

  6. keycode键盘 按键 - 键码 对应表

    字母和数字键的键码值(keyCode) 按键 键码 按键 键码 按键 键码 按键 键码 A 65 J 74 S 83 1 49 B 66 K 75 T 84 2 50 C 67 L 76 U 85 3 ...

  7. 《黑白团团队》第八次团队作业:Alpha冲刺

    项目 内容 作业课程地址 任课教师首页链接 作业要求 团队项目 填写团队名称 黑白团团队 填写具体目标 认真负责,完成项目 <黑白团团队>第七次作业:团队项目设计完善&编码 Git ...

  8. (33)Spring Boot 监控和管理生产环境【从零开始学Spring Boot】

    [本文章是否对你有用以及是否有好的建议,请留言] spring-boot-actuator模块提供了一个监控和管理生产环境的模块,可以使用http.jmx.ssh.telnet等拉管理和监控应用.审计 ...

  9. Locally managed (LMT) vs. Dictionary managed (DMT) tablespace

    The LMT is implemented by adding the extent management local clause to the tablespace definition syn ...

  10. BZOJ 1013 cogs 1845 [JSOI2008]球形空间产生器sphere

    题目描述 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产 ...