用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的原理介绍部分 ...
随机推荐
- VMWare虚拟机Centos 6.9中的 linux 配置静态ip地址上外网
1.查看网络 # ifconfig 发现网络还没有配置,ping不通 2.修改网卡配置文件 # vim /etc/sysconfig/network-scripts/ifcfg-eth0 添加如下配置 ...
- Hadoop2.6.5高可用集群搭建
软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3, m4, m5这五部机, 每部主机的用户名 ...
- IIS7部署网站的一些细节问题。
1.不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况. 这个错误的原因是在 IIS 7中 采用了更安全的 web.config 管理机制,默认情况下会锁住配置项.要取消锁定可以以 ...
- day35-1 类的三大特性---继承,以及类的派生
目录 类的继承 继承的特性 类的派生 类的组合 类的继承 继承是为了拿到父类的所有东西 继承的特性 减少代码的冗余 Python中父类和子类的对应关系是多对多 使用__bases__方法获取对象继承的 ...
- STM32F103 rtthread工程构建
目录 STM32F103 工程构建 1.基本情况 2.硬件连接 3.rtthread配置 4.点灯 5. 码云上git操作 STM32F103 工程构建 1.基本情况 RAM 20K ROM 64K ...
- C#第七节课
for嵌套 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System ...
- 域名IP绑定
该文为阿里云域名举例 首先具备3个前提: 买服务器并搭建环境:阿里云官网购买阿里云的服务器(我购买的是window系统,ECS服务器). 在自己的云服务器上布置上jdk,配置环境变量:安装上tomca ...
- Problem 22
Problem 22 Using names.txt (https://projecteuler.net/problem=22)(right click and 'Save Link/Target A ...
- CentOS 7 x64下Apache+MySQL(Mariadb)+PHP5.6的安装
每次搭建新服务器,都要来来回回把这些包再装一下,来来回回搞了不下20遍了吧,原来都是凭经验,配置过程中重复入坑是难免的,故写此文做个备忘.虽然有像xampp这样的集成包,但是在生产环境的Linux发行 ...
- kettle 递归循环
var i = new Number(parent_job.getVariable(; parent_job.setVariable("i",i); true;