用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的原理介绍部分 ...
随机推荐
- VM虚拟机中Ubuntu中执行apt-get update失败的解决方法(可能有效)
首先确保虚拟机是连接网络的,可以用ping命令检测一下看是否连通网络.采用nat网络的时候确保服务是开的. 如果之前执行过apt-get update命令但是失败了,执行一下 rm -rf ...
- 浅谈ByteBuffer转换成byte[]时遇到的问题
有些时候我们要把ByteBuffer转换成byte[]来使用.于是很多时候会用以下代码来转换: ByteBuffer buf; .....(一些往buffer写数据的操作) byte[] bs= ne ...
- dubbo之结果缓存
结果缓存,用于加速热门数据的访问速度,Dubbo提供声明式缓存,以减少用户加缓存的工作量. lru 基于最近最少使用原则删除多余缓存,保持最热的数据被缓存. threadlocal 当前线程缓存,比如 ...
- appium处理app与web页面的转换
测微信页面的时候使用谷歌app,进入微信页面的链接 def setUp(self): print("set up env for android testing...") se ...
- C#第十二节课
数组 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Th ...
- uwsgi部署django,里的request调用的接口响应慢解决方法
解决方法,增加2个线程 uwsgi.ini 配置如下 chdir=/var/www/Ultramanpidfile=/tmp/uwsgi.pidmodule=Ultraman.wsgimaster=t ...
- 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 ...
- PAT 1072. Gas Station
A gas station has to be built at such a location that the minimum distance between the station and a ...
- python orm框架-----SQLALchemy-查询篇
似乎ORM最难设计的部分是查询.特别是面向对象的查询,今天学习SQLAlchemy,发现SQLAlchemy的查询语法竟如此灵活,惊叹其如此强大的表达能力的同时也对Python也有了更深的认识.下面看 ...
- IT培训机构的招生诈骗大曝光
作者曾在某知名IT培训机构工作过,目睹了招生欺诈,后来作者果断辞职,不能为奸商工作,助纣为虐,在此曝光,以免学生的血汗钱白交.社会上的IT培训机构手法大都一样,奸商都是有套路的.X大青鸟,X内外企IT ...