MEF 导入(Import)和导出(Export)

前言:

MEF不同于其他IOC容器(如:Castle)很重要的原因在于它使用了特性化编程模型(涉及到两个概念:“特性”和“编程模型”)。

特性(Attribute):举例来说就是我们在开发过程中在类上标记的如:[Serializable]的标签。

编程模型(Programming Model):MEF中的编程模型是定义 MEF 所操作的概念性对象集的特定方法。MEF默认使用特性化编程模型,但是用户也可自定义编程模型。MEF中导入、导出间的匹配均是通过特性来实现的。本文简单的介绍下MEF中得导入和导出。

导入和导出基础:

在上一篇文章中我们说过导出提供服务,而导入是使用服务。导入使用 Import特性声明 ,导出使用 Export 特性声明。 Export 特性可修饰类、字段、属性或方法,而 Import 特性可修饰字段、属性或构造函数参数。导入和导出的匹配必须要有相同的Contract,Contract有两部分组成:ContractName(名称)和ContractType(类型),只有名称和类型都完全相同,才会认为导出能够满足特定导入。如:

View Code  1 public interface ILog 2 { 3      void Log(Exception ex); 4 } 5 6 //导出的类型为ILog[Export(typeof(ILog))] 7 pulic class FileLog:ILog 8 { 9      public void Log(Exception ex) 10      { 11      } 12 } 13 14 pulic class MyClass 15 { 16         //导入的类型默认为ILog,可以与导出匹配    [Import] 17     pulic Ilog MyLog 18     { 19         get; 20         set; 21     } 22 }

导入的类型:

MEF中导入的类型包括了:动态导入、延迟导入、必备导入和可选导入。

动态导入:使用dynamic关键字进行导入,协定类型从 dynamic 关键字推断而出,则它将与任何协定类型匹配。所以在使用倒台导入时必须指定协定名称,否则将未匹配任何导出

1 public class MyClass 2 { 3     [Import(“MyLog”)] 4     public dynamic MyLog{ get; set; } 5 }

延迟导入:我们知道延迟加载,那么延迟导入同延迟加载的作用一样:导入和导出匹配时不会立即实例化对象,延迟导入需要使用Lazy<T>来声明导入:

1 public class MyClass 2 { 3     [Import] 4     public Lazy<ILog> MyLog { get; set; } 5 }

 

必备导入:在我们的日常工作中我们可能经常会用到依赖注入,依赖注入有一种方式便是通过构造函数将我们需要的对象注入到本类中,MEF也可以完成相同的工作。

    导出的 MEF 部件通常由组合引擎创建,默认情况下,在创建部件时,组合引擎将使用无参数的构造函数。要想使用自定义构造函数需要使用特性:ImportingConstructor。使用必备导入时必须同时提供默认构造和ImportingConstructor的构造方法,否则将出错.MEF允许导入和导出的循环依赖。

 1 public class MyClass 2 { 3     private ILog _myLog; 4 5     public MyClass() { } 6 7     [ImportingConstructor] 8     public MyClass(ILog myLog) 9     { 10         _myLog = myLog; 11     } 12 }

 

可选导入:在MEF中如果导入得不到匹配将会组合失败,但我们需要容错时,使用AllowDefault 属性指定导入为可选:[Import(AllowDefault = true)]。这样即使导入没有得到匹配也不会影响组合容器对部件的组合。

导入多个对象:导入和导出可以支持一对多的关系,使用ImportMany特性可以导入多个服务(导出),使用ImportMany标记的导入始终是可选导入。

1 public class MyClass 2 { 3     [ImportMany] 4     public IEnumerable<ILog> MyLogs { get; set; } 5 }

导入和导出的继承

导入的继承:导入始终由子类继承,子类拥有和父类相同的导入。

导出的继承:使用Export特性的导出部件始终不能呗继承,如果想要导出部件可以被继承需要使用关键字:InheritedExport,子类将提供与父类相同的导出(包括ContractName和ContractType)。但是InheritedExport只能标记在类上,也就是说成员导出永远不能被继承。

后记:导入和导出相关的概念还包括元数据,以及自定义导出相关知识,将在下一篇中详细介绍。

本文参考:http://msdn.microsoft.com/zh-cn/library/ee155691.aspx#MtViewDropDownText

 

作者:ps_zw

出处:http://www.cnblogs.com/pszw/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

转载于:https://www.cnblogs.com/zjoch/p/3652789.html

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

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

相关文章

Android SimpleAdapter的参数

1.作用是ArrayList和 ListView的桥梁。这个ArrayList里边的每一项都是一个Map<String,?>类型。 ArrayList当中的每一项 Map对象都和ListView里边的每一项进行数据绑定一一对应。2.SimpleAdapter的构造函数&#xff1a;SimpleAdapter(Context context, List<? …

JMeter 教程汇总链接

http://www.360doc.com/content/14/0318/23/16361380_361732630.shtml 可以作为入门系列教程。 尽管网页也给出了视频链接&#xff0c;但是我不建议看视频学习&#xff01; 建议直接看文字&#xff08;可以跳跃式学习&#xff0c;视频的则是线性学习&#xff09;转载于:https:…

C++ STL中set底层实现方式

Q&#xff1a;STL中set底层实现方式&#xff1f; 为什么不用hash&#xff1f; A: 第一个问题:set底层实现方式为RB树&#xff08;即红黑树&#xff09;。 第二个问题: 首先set&#xff0c;不像map那样是key-value对&#xff0c;它的key与value是相同的。关于set有两种说法&…

python自动获取天气_用python获取天气数据,并作定时播报

原标题&#xff1a;用python获取天气数据&#xff0c;并作定时播报数据挖掘入门与实战 公众号&#xff1a; datadw思路1.调用和风天气的API&#xff0c;获取天气数据2.用百度语音API&#xff0c;将天气数据合成语音3.用树莓派每天早上定时播报天气(定时任务crontab Python脚本…

c++实现解析文件路径

注意&#xff1a;本实现只能解析类似linux下的路径&#xff0c;即“/data/a.txt”&#xff0c;而不能解析“c:\a.txt” 或者“c:\\a.txt”&#xff0c;但是应该很容易扩展改写实现此功能。 FilepathParse.h #include <string> using std::string;void parseFilepath(str…

gedit搭建c开发环境

在管理外部工具中&#xff0c;创建启动脚本 1 #!/bin/sh 2 DIR$GEDIT_CURRENT_DOCUMENT_DIR 3 NAME$GEDIT_CURRENT_DOCUMENT_NAME 4 /home/lxy/code/c/struct/run.sh ${DIR}/${NAME} 创建run.sh #!/bin/sh file$1 ext${file##*.}#C if [ $ext "c" ]; thenif [ -f $f…

Oracle数据库入门——常用的数据字典

一、oracle数据字典主要由以下几种视图构成&#xff1a;1.user视图以user_为前缀&#xff0c;用来记录用户对象的信息 2.all视图以all_为前缀&#xff0c;用来记录用户对象的信息及被授权访问的对象信息 3.dba视图以dba_为前缀&#xff0c;用来记录数据库实例的所有对象的信息 …

一个excel文档里复制黏贴另外表单跟着变动_利用Excel连接Power BI,实现PPT报告自动输出...

​文/HALI就职于汽车行业战略部门 专注汽车市场信息情报收集和分析因为工作需要&#xff0c;每月周期性的更新数据和撰写PPT 报告成为繁重的劳动。结果是很多时间花费在数据处理上&#xff0c;真正的分析工作&#xff0c;往往只能草草收场。不能坐以待毙&#xff0c;就要想想有…

出现23.97帧率的原因

http://raytao.lofter.com/post/3d177_185a386 关于那些“格&#xff08;Frame&#xff09;”不得不说的事 今天早上&#xff0c;鄙人在社交网络发了这一系列的问题&#xff1a;请解释以下名词之间的关系或差异。帧&#xff0c;格&#xff0c;帧率&#xff0c;时基&#xff0c;…

8-3建立蒙版

http://www.missyuan.com/thread-527018-1-1.html 在实际操作中&#xff0c;99.9%的蒙版都是通过选区建立的 所以选区要选好 点击图层调板下方的按钮直接建立蒙版(下左图红色箭头处)&#xff0c;效果等同于【图层_图层蒙版_显示选区】 图层中有了两个对象&#xff1a;一是图层&…

今天试了一下iscroll

感觉5和4差别还是有一点的&#xff0c;虽然不是很多&#xff0c;今天用了一下&#xff0c;感觉还是很不错。 今天看到有人提问说如果页面要引入多个iscroll怎么弄的问题&#xff0c;其实很简单&#xff0c;页面再多实例化一次就可以了。 如&#xff1a; myScroll new iScroll(…

使用ajax将数据显示在指定位置_AJAX学习主题之一

学习主题&#xff1a;AJAX删除用户功能实现根据视频中的讲解&#xff0c;完成以下内容简述删除功能的基本思路流程点击按钮获取当前元素中的用户uid&#xff0c;向服务器发起请求&#xff0c;将uid提交到服务器删除指定用户&#xff0c;浏览器获取浏览器响应结果。独立完成删除…

matlab 配置mex 识别vs2015

问题&#xff1a;先安装了matlab&#xff0c;后装了vs13和vs15,但是mex -setup时却不能识别vs15&#xff0c;采用了两种办法&#xff0c;最终得以识别。解决方案&#xff1a;先采用方法&#xff1a; http://blog.csdn.net/yc461515457/article/details/51635842 &#xff0c;但…

互联网企业安全高级指南3.6 需要自己发明安全机制吗

3.6 需要自己发明安全机制吗 1. 安全机制的含义 首先解释一下发明安全机制这句话的意思。安全机制包括&#xff1a;常见的对称和非对称加密算法&#xff0c;操作系统自带的RBAC基于角色的访问控制&#xff0c;自带的防火墙Netfilter&#xff0c;Android的基于appid隔离的机制&…

钩子方法

Class#inherited 类被继承时调用 Module#included 模块的生命周期中调用 Module#extend_object 模块扩展类时调用 Module#method_added Module#method_removed Module#method_undefined转载于:https://www.cnblogs.com/qinyan20/p/3656156.html

ember启动报错

ember[4858] (FSEvents.framework) FSEventStreamStart: register_with_server: ERROR: f2d_register_rpc() > (null) (-21) events.js:85 throw er; // Unhandled ‘error’ event ^ Error: watch EMFILE at exports._errnoException (util.js:746:11) at FSEvent.FS…

js日期比较大小_node.js 内存泄漏的秘密

每日前端夜话第276篇翻译&#xff1a;疯狂的技术宅作者&#xff1a;Giovanny Gongora来源&#xff1a;nodesource正文共&#xff1a;3955 字预计阅读时间&#xff1a;10分钟一直以来&#xff0c;跟踪 Node.js 的内存泄漏是一个反复出现的话题&#xff0c;人们始终希望对其复杂性…

win7+vs2015/13+caffe+matlab+python(CPU only)配置

首先声明本教程可以适用于vs2015 和vs2013 .以vs2015为例。 安装必备软件 vs 2015 /vs2013 matlab 2016a(64bit)推荐使用Anaconda 2.7 或者Miniconda 2.7这两个Python发布版本cmake 3.8.0 以上caffe-window: https://github.com/BVLC/caffe/tree/windows 可选软件&#xff1…

Performance Co-Pilot

Install Performance Co-Pilot 提前安装依赖 [rootiZrj97j6t7ih9hgz1me35hZ ~]# cat install.sh yum install -y docker yum install -y git yum install -y yum-utils-1.1.31-40.el7.noarch yum install lex yum install flex yum install -y bison yum install -y perl-ExtUt…