用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.示例下载

转载于:https://www.cnblogs.com/Khan-Sadas/p/4918040.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C排序算法:(一)直接排序

最简单的排序方法。 如果从大到小排序&#xff0c;那么从[0]元素开始&#xff0c;和后面的元素进行对比&#xff0c;如果后面元素大&#xff0c;则和[0]元素交换。 核心思想&#xff1a;选定基准元素&#xff0c;和其他元素对比。 #include <stdio.h>unsigned char buff…

c语言 链表_C语言编程第22讲——单向有序链表的C语言实现

1、单向有序链表的含义单向有序链表可以解析为四个名词&#xff1a;表&#xff1a;一组元素&#xff1b;链表&#xff1a;表中的元素不是从前往后一个挨着一个&#xff0c;而是通过一个元素才能找到另一个元素&#xff1b;单向&#xff1a;表中的元素只能从前往后访问&#xff…

C排序算法:(二)冒泡排序

冒泡排序就是从左至右比较相邻的两个数值大小&#xff0c;如果右侧的数值较小&#xff0c;则交换两个数值的位置&#xff0c;较大的数值就会像泡泡一样一路向右漂浮。 #include <stdio.h>//small to big void Bubble_Sort(unsigned char *input_data, unsigned int inpu…

pythonturtle画点的指令_简述python的turtle绘画命令及解释

一 基础认识 turtle库是python的标准库之一&#xff0c;它是一个直观有趣的图形绘制数据库&#xff0c;turtle(海龟&#xff09;图形绘制的概念诞生1969年。它的应用十分广&#xff0c;而且使用简单&#xff0c;只要在编写python程序时写上import turtle即可。 1.绘图窗口设置命…

OpenGL ES一些函数详解(一)

glLoadIdentity和glMultMatrix glLoadIdentity的作用是将当前模型视图矩阵转换为单位矩阵&#xff08;行数和列数相同的矩阵&#xff0c;并且矩阵的左上角至右下角的连线上的元素都为1&#xff0c;其它元素都为0&#xff09;&#xff0c;这样可以方便矩阵的乘法运算。 glMultMa…

C排序算法:(三)插入排序

像打扑克牌一样&#xff0c;每次摸一张牌&#xff0c;把牌插入正确位置。 #include <stdio.h>void Insert_Sort_Small_To_Big(unsigned char* input_data, unsigned int input_length) {int i 0, j 0;unsigned char temp 0;for (i 1; i < input_length; i){temp …

LeetCode Binary Tree Paths(简单题)

题意&#xff1a;   给出一个二叉树&#xff0c;输出根到所有叶子节点的路径。 思路&#xff1a; 直接DFS一次&#xff0c;只需要判断是否到达了叶子&#xff0c;是就收集答案。 1 /**2 * Definition for a binary tree node.3 * struct TreeNode {4 * int val;5 * …

新唐M0 KEIL环境搭建,找不到device不识别,关键:Nu-Link_Keil_Driver

公司用新唐的芯片&#xff0c;网上关于新唐的资料相对ST确实少得可怜&#xff0c;搭建环境也是搞了好久&#xff0c;去keil官网下载安装了新唐的pack 打开官方参考工程还是提示找不到device&#xff0c;option里面也没有识别出来。 百度了好久&#xff0c;尝试了各种办法&…

c语言有趣代码_【新课预知】——C语言程序设计

编者按&#xff1a;如今疫情这么严重&#xff0c;为了保护好自己&#xff0c;为了身边的人&#xff0c;大家可一定要听从国家号召——“宅”起来&#xff01;并且&#xff0c;小编们为了让大家伙“宅”得更加健康&#xff0c;可是费了不少脑筋呢&#xff0c;学哉数理公众号首次…

用R语言的quantreg包进行分位数回归

什么是分位数回归 分位数回归(Quantile Regression)是计量经济学的研究前沿方向之一&#xff0c;它利用解释变量的多个分位数&#xff08;例如四分位、十分位、百分位等&#xff09;来得到被解释变量的条件分布的相应的分位数方程。 与传统的OLS只得到均值方程相比&#xff0c;…

常规单元测试和存根–测​​试技术4

我的上一个博客是有关测试代码的方法以及讨论您要做和不需要进行测试的方法的一系列博客中的第三篇。 它基于我使用一种非常常见的模式从数据库中检索地址的简单方案&#xff1a; …并且我提出了这样的想法&#xff1a;任何不包含任何逻辑的类都不需要进行单元测试。 在其中&am…

中微CMS32 Keil环境搭建

打开中微官网https://www.mcu.com.cn/Products/113/pids/.html 把这三个资料都下载好。 环境搭建需要用的就是第三个pack包了 坑爹的是pack包下载下来是.zip格式 下载好后需要修改为.pack格式 运行即可。 打开三个资料中的demo code的工程 target和device都能识别出 编…

测试技巧–不编写测试

对此没有太多疑问&#xff0c;测试代码的方式是一个有争议的问题。 不同的测试技术因各种原因&#xff08;包括企业文化&#xff0c;经验和总体心理观点&#xff09;而受到不同开发人员的青睐。 例如&#xff0c;您可能更喜欢编写经典的单元测试&#xff0c;通过检查返回值来单…

Ubuntu镜像下载地址

https://mirrors.aliyun.com/ubuntu-releases/ 用迅雷下载速度挺快的

Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum (离线树状数组+前缀xor)

题目链接&#xff1a;http://codeforces.com/contest/703/problem/D 给你n个数&#xff0c;m次查询&#xff0c;每次查询问你l到r之间出现偶数次的数字xor和是多少。 我们可以先预处理前缀和Xor[i]&#xff0c;表示1~i的xor和。因为num^num0&#xff0c;所以Xor[r] ^ Xor[l - 1…

九齐51单片机使用注意事项:不要用float

在使用ADC计算电压值时用了float&#xff0c;NY8B072A堆栈直接炸了&#xff0c;用32机习惯了&#xff0c;一直想不通&#xff0c;查了手册才知道。 手册是&#xff1a;《NYC_NY8_UM_v1.5_SC.pdf》 链接&#xff1a;https://www.nyquest.com.tw/cn/support/download/Nyquest_SW…

go 基准测试 找不到函数_基于Golang做测试

本文在实习期间完成并完善&#xff0c;无任何公司机密&#xff0c;仅做语言交流学习之用。持续更新。1.Golang的单元测试Go语言提供了丰富的单测功能。在Go中&#xff0c;我们通常认为函数是最小的可执行单元。本例中使用两个简单的函数&#xff1a;IsOdd和IsPalindrome来进行G…

九齐NY8B072A单片机使用笔记(三)模拟串口RX

因为这款单片机没有硬件串口&#xff0c;所以需要我们自己做软件模拟串口。 用PA3作为RX&#xff0c;因为PA3可以作为外部输入中断EXTI1。 本人首先用轮询的方式查PA3是否从高电平跳变到低电平&#xff08;起始信号&#xff09;&#xff0c;但是因为还有别的业务逻辑&#xf…

[LindCode] Binary Tree Postorder Traversal

Binary Tree Postorder Traversal Given a binary tree, return the postorder traversal of its nodes values. Example Given binary tree {1,#,2,3}, 1\2/3return [3,2,1]. Challenge Can you do it without recursion? SOLUTION 1: recursion&#xff1a; 分治法解决之&am…

金山毒霸垃圾清理

金山毒霸-垃圾清理-单文件封装,清洁洁癖的爱好&#xff01; 实话&#xff0c;金山的软件确实不错。展望金山可以在软件行业&#xff0c;做出让世界都使用的。为国人扛起一片天 下载地址&#xff1a; http://pan.baidu.com/s/1dFa7GdV转载于:https://www.cnblogs.com/xiaochina/…