写在前面:下面学习所得多是从自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. android studio高德地图的显示于定位(附带逆地理编码围栏)

    首先注册高德成为开发者(打开高德地图,点击底部的开发者平台),创建应用,按照要求填写相应信息 网站:http://lbs.amap.com/api/android-sdk/guide/create-p ...

  2. 使用Sql Server Management Studio 2008将数据导出到Sql文件中

      最近需要将一个Sql Server 2005数据库中的数据导出,为了方便,就希望能导出成Sql文件,里面包含的数据是由Insert 语句组成的. 在Sql Server Management St ...

  3. 创建dml触发器

    -实现删除学生信息时把该学生的成绩记录全部清空 --判断触发器是否存在 if exists(select * from sysobjects where name = 'delete_student' ...

  4. Math工具类的使用

    1.包:java.lang  不需要导包 2.Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函数. 特点: 该类中的方法都是静态方法,所以可以直接使用类名.方法名(实参)调 ...

  5. 洛谷P1426 小鱼会有危险吗【水题模拟】

    有一次,小鱼要从A处沿直线往右边游,小鱼第一秒可以游7米,从第二秒开始每秒游的距离只有前一秒的98%.有个极其邪恶的猎人在距离A处右边s米的地方,安装了一个隐蔽的探测器,探测器左右x米之内是探测范围. ...

  6. nyoj22-素数求和问题

    素数求和问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 现在给你N个数(0<N<1000),现在要求你写出一个程序,找出这N个数中的所有素数,并求和. ...

  7. CSS max-width: 0;

    写CSS,大家都知道max-width是要在宽度超过后才会生效,但今天我发现一个神奇的现象, 为表格td加上max-width: 0;可以让上下两个表格自动对齐,这句的作用到底是什么还有待研究,今天先 ...

  8. 工厂模式的python实现

    #1.什么是工厂模式 #2.工厂模式的分类 ''' 1. 简单工厂模式 2. 工厂方法模式 3. 抽象工厂方法模式 ''' #3.简单工厂模式的python实现 from abc import ABC ...

  9. 批量重命名B站下载文件

    将B站下载的文件统一修改文件名 事情来由 事情是这样的,我在B站上发现一个教程,看了一下,非常不错,于是想下载下来(免得B站和谐). 问题就是这样来了,我手机没多少内存,下载后下发现文件在手机中都是以 ...

  10. (9)使用JdbcTemplate【从零开始学Spring Boot】

    整体步骤: (1)   在pom.xml加入jdbcTemplate的依赖: (2)   编写DemoDao类,声明为:@Repository,引入JdbcTemplate (3)   编写DemoS ...