MEF 导入(Import)和导出(Export)
前言:
MEF不同于其他IOC容器(如:Castle)很重要的原因在于它使用了特性化编程模型(涉及到两个概念:“特性”和“编程模型”)。
特性(Attribute):举例来说就是我们在开发过程中在类上标记的如:[Serializable]的标签。
编程模型(Programming Model):MEF中的编程模型是定义 MEF 所操作的概念性对象集的特定方法。MEF默认使用特性化编程模型,但是用户也可自定义编程模型。MEF中导入、导出间的匹配均是通过特性来实现的。本文简单的介绍下MEF中得导入和导出。
导入和导出基础:
在上一篇文章中我们说过导出提供服务,而导入是使用服务。导入使用 Import特性声明 ,导出使用 Export 特性声明。 Export 特性可修饰类、字段、属性或方法,而 Import 特性可修饰字段、属性或构造函数参数。导入和导出的匹配必须要有相同的Contract,Contract有两部分组成:ContractName(名称)和ContractType(类型),只有名称和类型都完全相同,才会认为导出能够满足特定导入。如:
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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
MEF 导入(Import)和导出(Export)的更多相关文章
- [vue]js模块导入导出export default
webstrom调试未授权问题解决 分es6语法和node语法 参考 参考 - export default s1 1.仅能出现1次default 2.导入时候可以随便命名 3,导出时候不必写{} - ...
- C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import)
上一篇学习完了MEF的基础知识,编写了一个简单的DEMO,接下来接着上篇的内容继续学习,如果没有看过上一篇的内容, 请阅读:http://www.cnblogs.com/yunfeifei/p/392 ...
- 【DB宝50】Oracle异构平台迁移之完全可传输导出导入(Full Transportable Export & Import)
目录 一.简介 1.1.使用场景 1.2.限制条件 二.完全可传输操作步骤 三.案例演示 3.1.环境 3.2.源库操作 3.2.1.将需要传输的用户表空间设置为RO状态 3.2.2.使用Data P ...
- Node.js模块导出module.exports 和 exports,Es6模块导出export 和export default的区别
1.module.exports module变量代表当前模块.这个变量是一个对象,module对象会创建一个叫exports的属性,这个属性的默认值是一个空的对象: module.exports ...
- SVN中检出(check out) 和 导出(export) 的区别
SVN是常用的一种常见的版本控制软件.SVN中检出(check out) 和 导出(export) 的区别主要有如下几条: check out跟check in对应,export跟import对应. ...
- SVN中检出(check out) 跟导出(export) 的区别
SVN中检出(check out) 和导出(export) 的区别?观点一:SVN是常用的一种常见的版本控制软件.SVN中检出(check SVN中检出(check out) 和导出(export ...
- 包(package) 与 导入(import) 语句剖析
A) 包(package):用于将完成不同功能的类分门别类,放在不同的目录下. B)命名规则:将公司域名翻转作为包名.例如www.vmaxtam.com域名,那么包名就是com.vmaxtam 每个字 ...
- C#变成数据导入Excel和导出Excel
excel 基础 •整个excel 表格叫工作表:workbook:工作表包含的叫页:sheet:行:row:单元格:cell. •excel 中的电话号码问题,看起来像数字的字符串以半角单引号开头就 ...
- python-模块的导入import
#-*- coding:utf-8 -*- #本次学习:模块的导入 ''' 1.模块名不能与第三方库或者本地库名字重名/冲突 2.导入模块时,寻找顺序:现在当前目录找,再去我们环境变量配置的pytho ...
- 第十八篇 模块与包--time&random模块&模块导入import(os.path.dirname(os.path.abspath(__file__)))
模块 在Python中, 一个.py文件就称为一个模块. 使用模块的好处: 1. 最大的好处就是大大提高了代码的可维护性 2. 编写代码不必从零开始.一个模块编写完毕,就可以被其他地方引用.在写其他程 ...
随机推荐
- ZOJ 1610 Count the Colors(区间染色)
题目大意:多组数据,每组给一个n(1=<n<=8000),下面有n行,每行有l,r,color(1=<color<=8000),表示将l~r颜色变为color,最后求各种颜色( ...
- 在JAVA中生成RSA秘钥对实现SSH互信
https://blog.csdn.net/u014196729/article/details/51496262 https://blog.csdn.net/u013066244/article/d ...
- SGU 205. Quantization Problem
205. Quantization Problem time limit per test: 0.25 sec. memory limit per test: 65536 KB input: stan ...
- 在microsoft/dotnet:2.0.0-sdk中安装vim编辑器
在Docker中安装了dotnetcore 2.0.0 的sdk,没有发现可用的编辑器,该sdk是基于debian:stretch构建的,以前没玩过debian,因为CentOS玩的多一些所以对vim ...
- 尝试php命令行脚本多进程并发执行
php不支持多线程,但是我们可以把问题转换成“多进程”来解决.由于php中的pcntl_fork只有unix平台才可以使用,所以本文尝试使用popen来替代. 下面是一个例子: 被并行调用的子程序 ...
- 转:The Great DOM Fuzz-off of 2017
The Great DOM Fuzz-off of 2017 Posted by Ivan Fratric, Project Zero https://googleprojectzero.blogsp ...
- 20169211《Linux内核原理与分析》第三周作业
假期中抽时间学习了一下linux内核的启动过程,在此做一下学习总结. Linux启动过程描述: 1.启动BootLoader 2.Linux系统的初始化 3.Linux的应用程序的初始化 通用寄存器的 ...
- Python类总结-封装(Property, setter, deleter)
Property #property #内置装饰器函数,只在面向对象中使用 from math import pi class Circle: def __init__(self,r ): self. ...
- 【JAVAWEB学习笔记】26_Linux基础:简介安装、常用命令和JDK、Mysql、Tomcat的安装
Linux基础 学习目标 1.了解Linux的简介与安装 2.掌握Linux常用的命令 3.掌握Linux系统上JDK.Mysql.Tomcat的安装 一.Linux的简介 1.Linux的概述 Li ...
- Am335x U-boot LCD简易驱动
参考此文档说明,自行添加相关代码: https://pan.baidu.com/s/1i5gLE89 相关代码: https://pan.baidu.com/s/1qXL8Bne 在文档说明第四步1中 ...