写在前面:下面学习所得多是从自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. 判断wifi是2.4G还是5G

    1.WifiInfo 源码: int mFrequency=wifiInfo.getFrequency(); /** * @hide * TODO: makes real freq boundarie ...

  2. ie8及其以下版本兼容性问题之placeholder实现

    1. 普通浏览器下修改placeholder颜色 因为每个浏览器的CSS选择器都有所差异,所以需要针对每个浏览器做单独的设定. 示例: input::-webkit-input-placeholder ...

  3. halcon 模板匹配 -- find_shape_model

    find_shape_model(Image : :  //搜索图像 ModelID, //模板句柄 AngleStart,  // 搜索时的起始角度 AngleExtent, //搜索时的角度范围, ...

  4. Shiro Shiro Web Support and EnvironmentLoaderListener

    Shiro Shiro Web Support 主要参考: http://shiro.apache.org/web.html 还有涛哥的 作为资源控制访问的事情,主要使用在网络后台方面,所以了解了本地 ...

  5. brew 安装的.net 运行时提示"Did you mean to run dotnet SDK commands?"

    原因未知,但有解决方案 使用 brew cask 安装的.NET Core brew cask install dotnet 结果运行时出现: 解决方案: 下载官方 .pkg 文件安装,顺便卸载掉 b ...

  6. python sqlalthemy 总结

    orm 数据状态的预知识 瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过Sessi ...

  7. TestNg学习一

    简介 TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit,   功能都差不多, 只是功能更加强大,使用也更方便 Java中已经有一个JUnit的测试框架了.  TestNG比JU ...

  8. Html 页面刷新后出现闪动

    Html 页面刷新后,或跳转后,出现闪动,抖动问题 1.查看有没有用到新字体,新字体链接位置是否存在 如: @font-face { font-family: "AvantGarde-Dem ...

  9. 02-Linux命令基础-第02天(压缩包管理、服务器搭建与使用、vim)

    01-   复习 /boot 目录 引导项 八种文件类型: 文件:- 目录:d 软链接:l 字符设备文件:c 块设备文件:b 管道:p 套接字:s 未知 cp –a 保持源文件属性(如时间属性 如果不 ...

  10. stylus解决移动端1像素线等问题

    引用了yo框架中的_border.scss(用来获取yo框架封装的border)   以及   variables.scss(用来获取媒体查询的规则) border($border-width = 1 ...