前言:在上一篇中,我们简单的介绍了导入和导出的基本知识以及一些基本用法,本篇将介绍一下在导出中经常使用的到两种技巧(其实就是MEF提供的两种特性):元数据(Metadata)和自定义导出(Custom Export)

元数据

  在MEF中,导出可提供自身的一些附加信息,我们称之为“元数据”。可通过元数据将导出的一些信息、属性传递给导入。上一篇介绍导入的时候提到了ImportMany,在ImportMany的时候有时候可能需要根据特定的条件过滤一些匹配的导出,这时我们可以利用导出的元数据作依据。此外,由于导入部件可以使用元数据来决定要使用哪些导出,或收集有关导出的信息而不必构造导出。 因此,导入必须为延迟导入才能使用元数据。

  使用元数据需要定义一个称为“元数据视图”的接口,元数据视图中有且只能定义只读的属性,可以使用特性

[DefaultValue]给属性默认值,元数据视图中定义的所有属性在使用时都必须赋值,否则使用改元数据的导出将与任何导入匹配失败,当然我们也可以使用[DefaultValue]设置默认值,这样被[DefaultValue]修饰的属性便可以认为是可选属性了。例:

public interface ILogMetadata
{  [DefaultValue("FileLog")] string LogType{ get; }string Name{ get; }
}

使用元数据视图修饰的导出:

[Export(typeof(ILog))]
[ExportMetadata("Name", "FileLog")]
[ExportMetadata("LogType", "FileLog")]
public class FileLog: ILog
{
}

注意:特性ExportMetadata的参数第一个为属性名称,第二个是属性的值。组合容器在组合时部件时会自动匹配所有的元数据视图,如果有符合的元数据视图则该导出部件视为匹配成功。

匹配导入(匹配含有元数据修饰的导出,导入需要使用延时加载):

public class MyLog
{[Import]public Lazy<ILog, ILogMetadata> singleLog   { get; set; }[ImportMany]public IEnumerable<Lazy<ILog, ILogMetadata>> logs;
}

自定义导出

  在上面的示例中我们可能会想,当元数据视图的的必选属性有很多时,我们是不是得使用很多的[ExportMetadata]来修饰导出,另外元数据视图的写法也很容易出错,其实MEF中可以对Export 和 InheritedExport 进行扩展,用于将元数据封装到自定义特性中。

  自定义特性可以指定ContractType、ContractName或任何其他元数据。 为了定义自定义特性,必须使用 MetadataAttribute 特性来修饰继承自 ExportAttribute(或 InheritedExportAttribute)的类。 例:

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple=true)]//指定特性的作用域
public class FileLogExportAttribute : ExportAttribute
{public FileLogExportAttribute(string logType) : base(typeof(ILog)){LogType= logType;Name = "FileLog";}public string LogType{ get; private set; }public string Name{ get; private set; }
}

使用自定义导出修饰前面导出:

[FileLogExport("FileLog"))
public class FileLog: ILog
{
}

使用自定义导出的特性,ContractType是隐式定义的,

  “在必须将大量的相同元数据(例如,作者或版权信息)应用于多个部件的情况下,使用自定义特性可以节约大量的时间和重复工作。 此外,可以创建自定义特性的继承树来为变体留出余地。

  若要在自定义特性中创建可选元数据,您可以使用 DefaultValue 特性。 如果此特性应用于自定义特性类中的属性,它将指定修饰的属性是可选的,并且不必由导出程序提供。 如果未提供属性的值,则将为属性分配其属性类型的默认值(通常为 null、false 或 0。)”——MSDN

结束语:MEF中导入是不能进行自定义的,但MEF中得导出和元数据的配合使得导出更加灵活。

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

学习MEF系列(3):导入(Import)和导出(Export) (续)相关推荐

  1. 学习MEF系列(2):导入(Import)和导出(Export)

    前言: MEF不同于其他IOC容器(如:Castle)很重要的原因在于它使用了特性化编程模型,何为特性化编程这里不细究,简单说明下两个概念:"特性"和"编程模型" ...

  2. 学习MEF系列(4):组合容器(CompositionContainer)和目录(Catalog)

    前言 通过之前的文章,我们已经了解了MEF中的导入(Import)和导出(Export).在本系列的第一篇文章中我们知道MEF其实还包括另外两个核心内容:组合容器(CompositionContain ...

  3. 学习MEF系列(1):MEF是什么?

    前言: 一种新技术,一个新框架的出现并不是偶然的,它们都是为了解决一定的实际问题.如今IT各种技术.框架的更新很迅速,一步留神就感觉自己out了,当然,技术没有优劣好坏之分,能更好的解决实际问题我们就 ...

  4. c# MEF框架(二 MEF的导出(Export)和导入(Import))

    转自:http://www.cnblogs.com/yunfeifei/p/3922891.html 上一篇学习完了MEF的基础知识,编写了一个简单的DEMO,接下来接着上篇的内容继续学习,如果没有看 ...

  5. access 导入 txt sql语句_从零开始学习 MySQL 系列索引、视图、导入和导出

    阅读本文大概需要 8 分钟 前言上篇文章我们学习了数据库和数据表操作语句,今天我们学习下数据库索引,视图,导入和导出的知识.作为基础篇,不会涉及到关于索引和视图的高级应用和核心概念,但是基本操作大家会 ...

  6. mysql导入dat文件_从零开始学习 MySQL 系列--索引、视图、导入和导出

    前言 上篇文章我们学习了数据库和数据表操作语句,今天我们学习下数据库索引,视图,导入和导出的知识. 作为基础篇,不会涉及到关于索引和视图的高级应用和核心概念,但是基本操作大家会了解,尤其是关于索引的内 ...

  7. bcp out 带列名导出_从零开始学习 MySQL 系列索引、视图、导入和导出

    阅读本文大概需要 8 分钟 前言上篇文章我们学习了数据库和数据表操作语句,今天我们学习下数据库索引,视图,导入和导出的知识.作为基础篇,不会涉及到关于索引和视图的高级应用和核心概念,但是基本操作大家会 ...

  8. opencart导入导出export/import功能插件

    2019独角兽企业重金招聘Python工程师标准>>> 本版本仅适用于 opencart 1.5.5及 opencart 1.5.5.1,请下载者注意. 功能:网站管理员可以进行批量 ...

  9. 命令行导出和导入数据库 How to export and import MySQL database using command line Interface...

    导出 : To export MySQL database, open putty on Windows or Terminal in either MAC or Linux OS, Go to th ...

最新文章

  1. CentOS 7.X 安装 Gitlab 笔记
  2. 常用基础参数PrintGCDetails回收前后对比讲解
  3. 使用选择器语法查找元素——​​​​​​​Selector选择器概述 ——未完待续
  4. 水晶报表使用经验谈1--建立水晶报表第一步及编译最易出现错误的解决方法及报表转换成pdf文档进行打印方法...
  5. java映射的概念_Java 反射 概念理解
  6. pc,移动端局域网文件共享
  7. vector使用中可能出现的一个陷阱
  8. JQuery和JavaScript常用方法的一些区别
  9. sql date时间加减几天几小时
  10. [枚举] Jzoj P3387 终极武器
  11. 树(2)-----leetcode(层、深度、节点)
  12. matlab怎么对图片mesh,MATLAB提供了mesh函数和surf函数来绘制三维曲面图。
  13. 68. 使用Apache的rewrite技术
  14. pdf-lib给pdf添加水印并预览、下载、打印
  15. tsmaster中文版(M3U8下载器)
  16. 【Python3.6爬虫学习记录】(八)Selenium模拟登录新浪邮箱并发送邮件
  17. 21 年年度最佳开源软件!
  18. 【UVA 815 --- Flooded!】
  19. Python使用Plotly绘图工具,绘制散点图、线形图
  20. pid实现小车巡线绕桩

热门文章

  1. 人脸识别技术原理你知道吗?
  2. 好用的读书笔记app
  3. C语言学生综合测评系统
  4. 2021-06-12电子负载仪
  5. 天梯地图 (30 分)
  6. 【基于SSM+JSP+MySQL的垃圾分类管理系统的设计与实现(持续改进与迭代中~)】
  7. neo4j安装APOC拓展包
  8. AIC信息准则算法matlab实例
  9. 新大陆物联网竞赛-Android开发-导入JAR包与添加依赖
  10. 深入iOS系统底层之指令集介绍