用WPF做关于MEF 简单学习记录
写在前面:下面学习所得多是从自http://www.cnblogs.com/comsokey/p/MEF1.html和http://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 简单学习记录的更多相关文章
- Linux命令行及Vim简单学习记录
Linux命令行 1.打开命令行 Ctrl+Alt+t 2.目录 显示当前目录的文件列表 ls 跳转至当前目录中的x文件夹 cd x 返回根目录 cd 3.文件 新建文件1.cpp touch ./1 ...
- Linux awk工具简单学习记录
awk是一个文本分析工具,它把文件逐行读入,以特定符号将每行切分(默认空格为分隔符),切开的部分再进行各种分析处理. awk其名称得自于它的创始人Alfred Aho .Peter Weinberge ...
- wpf 全局异常捕捉+简单日志记录
`namespace MyApp { /// /// App.xaml 的交互逻辑 /// public partial class App : Application { public App() ...
- Settings app简单学习记录
Settings是android系统设置的入口.主界面由Settings.java以及settings_headers.xml构成. Settings类继承自PreferenceActivity,而P ...
- redis的简单学习记录
安装 1 brew install redis 启动redis服务 1 redis-server & 启动命令 1 redis-cli -h 127.0.0.1 -p 6379 利用gored ...
- MyBatis 学习记录3 MapperMethod类
主题 之前学习了一下MapperProxy的生产过程,自定义Mapper类的对象是通过动态代理生产的,调用自定义方法的时候实际上是调用了MapperMethod的execute方法:mapperMet ...
- zeromq学习记录(一)最初的简单示例使用ZMQ_REQ ZMQ_REP
阅读zeromq guide的一些学习记录 zeromq官方例子 在VC下运行会有些跨平台的错误 我这里有做修改 稍后会发布出来 相关的代码与库 http://download.zeromq.org ...
- Delphi中,indy控件实现收发邮件的几点学习记录( 可以考虑加入多线程,用多个邮箱做一个邮箱群发器) 转
关于用Delphi中的Indy控件实现收发邮件的几点学习记录 这几天心里颇不宁静,不是因为项目延期,而是因为自己几个月前做的邮件发送程序至今无任何进展,虽然一向谦虚的人在网上发 ...
- git原理学习记录:从基本指令到背后原理,实现一个简单的git
一开始我还担心 git 的原理会不会很难懂,但在阅读了官方文档后我发现其实并不难懂,似乎可以动手实现一个简单的 git,于是就有了下面这篇学习记录. 本文的叙述思路参照了官方文档Book的原理介绍部分 ...
随机推荐
- Android测试写入文本Log
写入本地SD卡: @SuppressLint("SdCardPath") public void writeFileSdcard(String fileName, String m ...
- jstl与el结合常见用法
JSTL Functions标签库 在JSP文件中使用Functions标签库,要先通过taglib指令引入该标签库: <%@taglib uri=”http://java.sun.com/js ...
- 【转】Linux rpm 命令参数使用详解[介绍和应用]
RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序” rpm 执行安装包二进制包(Binary)以及源代码包(Source)两种 ...
- freemarker使用map替换字符串中的值demo2
package demo01; import java.io.IOException;import java.io.OutputStreamWriter;import java.io.StringWr ...
- eas源码示例1
EditUI: this.kdtEntrys.getRow(0).getCell(1).setValue("这个是第一行的第1个单元格的值"); public void loa ...
- 使用GitHub代码仓库Repositories上传自己的项目代码
1.下载客户端github(必须下载,需要该软件所提供的Git shell输入命令来上传项目)下载地址: https://github-windows.s3.amazonaws.com/GitHubS ...
- 了解CSS overflow属性 标签: htmlcss属性 2016-12-31 14:38 75人阅读 评论(1)
overflow属性规定当内容溢出元素框时如何显示. 例:div { width:150px; height:150px; overflow:scroll; } 可能的值有: 值 ...
- Golang Gin实践 番外 请入门 Makefile
Golang Gin实践 番外 请入门 Makefile 原文地址:Golang Gin实践 番外 请入门 Makefile 前言 含一定复杂度的软件工程,基本上都是先编译 A,再依赖 B,再编译 C ...
- php实现网站访客数量统计的方法(简单实现,不能防刷新)
方法一: <?php function Counter()//定义函数 { $five = "00000";//声明变量,$five,$four等变量表示零的个数,放在数字前 ...
- node源码详解(四)
本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource4 本博客同步在https://cnodejs.o ...