[MEF]第03篇 MEF延迟加载导出部件及元数据
一、演示概述
此演示介绍了MEF的延迟加载及元数据相关的内容。
在实际的设计开发中,存在着某些对象是不需要在系统运行或者附属对象初始化的时候进行实例化的,
只需要在使用到它的时候才会进行实例化,这种方式就可以理解为对象的迟延初始化,或者叫迟延加载。 对于提升系统的性能大有裨益呀!
另外,还可以为导出的部件添加元数据,以便在代码中提供更加灵活的扩展办法,或获取更多的相关信息。甚至,还可以自定义元数据的接口,无论是定义还是使用都非常的方便。
相关下载(屏幕录像):http://yunpan.cn/cZCfFBypPSLCh 访问密码 0ce2
在线播放:
温馨提示:
如果屏幕录像和代码不能正常下载,可站内留言,或发邮件到524130780@QQ.COM
欢迎有兴趣研究.NET相关技术的网友加QQ群:18507443
二、延迟加载
延迟加载在导出部件处的设置没什么变化,保持原有的设置即可。如下代码所示:
- [Export("Oracal", typeof(ILogger))]
- public class OracalLogger : ILogger
- {
- public void WriteLog(string message)
- {
- Console.WriteLine("Oracal Logger => {0}", message);
- }
- }
在导入的时候,需要使用.NET提供的Lazy类来完成。代码如下:
- [Import("Oracal", typeof(ILogger))]
- public Lazy<ILogger> OracalLogger { get; set; }
通过Lazy封装的对象即自动提供了延迟加载的机制。访问对象的方式也略微有所改变,当然不能直接通过属性(上例中的OracalLogger)进行访问,而是需要通过Lazy<T>.Value来访问,此属性值包含的即使延迟加载的对象。
另外Lazy<T>.IsValueCreated属性提供了判断对象是否加载的功能,如果为true则表示对象已加载,否则为未加载。
三、元数据
关于MEF的数据的使用,首先需要给导出部件添加ExportMetadata特性,用来设置要添加的元数据。如下面代码所示:
- [ExportMetadata("Name", "Xml")]
- [ExportMetadata("Description", "使用的是XML来记录日志")]
- [Export("Xml", typeof(ILogger))]
- public class XmlLogger : ILogger
- {
- public void WriteLog(string message)
- {
- Console.WriteLine("Xml Logger => {0}", message);
- }
- }
如上代码所示,首先ExportMetadata特性可以被重复的添加到多个多出部件,另外,该特性的两个参数非常的类似于键值对,第一个参数为元数据的名称,第二个参数则是元数据的实际内容。
至此,导出部件所需要做的修改就算是完成了。接下来,就该修改导入了。如下代码所示:
- [Import("Xml", typeof(ILogger))]
- public Lazy<ILogger, IMetadata> XmlLogger { get; set; }
如上代码所示,仍然使用的Lazy类。其中第二个泛型参数表示的就是元数据的接口。定义大致如下:
- public interface IMetadata
- {
- string Description { get; }
- string Name { get; }
- }
仔细对比后会发现,该接口中的成员名称和导出部件中的元数据名称是如此的一致。实是上不仅其名称要保持一致,连数据类型也要保持一致,否则导入的时候将会引发异常。
经过如上的代码修改后,通过导入元素(上例中的XmlLogger属性)会有一个名为Metadata的属性,即Lazy<T, TMeta>.Metadata,通过它即可访问导出部件中的各个元数据了。
如下代码所示:
- Console.WriteLine(program.XmlLogger.Metadata.Name);
- Console.WriteLine(program.XmlLogger.Metadata.Description);
具体内容可参看演示视频中的介绍。
四、相关资源
1、MSDN官方资料:http://msdn.microsoft.com/zh-cn/library/dd460648(v=vs.110).aspx
2、参考了微软MVP Bēniaǒ的文章《MEF程序设计指南五:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)》,访问地址:http://www.cnblogs.com/beniao/archive/2010/07/14/1777593.html
相关文章
- Oracle如何实现创建数据库、备份数据库及数据导出导入的一条龙操作
- 【云速建站】后台数据批量导入导出
- oracle数据库导入导出命令
- phpexcel: 数据导出
- 【C#】Excel导出合并行和列并动态加载行与列
- spring boot:使用poi导出excel电子表格文件(spring boot 2.3.1)
- 机房收费系统——VB将MSHflexgrid控件中的数据导出为Excel
- Oracle10g 数据泵导出命令 expdp 使用总结
- JAVA笔记-如何将百万级数据高效的导出到Excel表单
- Oracle用imp和exp实现数据的导入和导出
- revit2018模型数据导出到mysql
- Python导出DBF文件到Excel的方法
- Docker - 导出导入容器
- oracle expdp 导出问题
- 关于 SAP UI5 控件内容的 Excel 导出功能,如何加载所需的导出工具库
- hybris导出系统已有数据的两种方式
- Py之pandas:字典格式数据与dataframe格式数据相互转换并导出到csv
- ML之FE:基于FE特征工程对RentListingInquries数据集进行预处理并导出为三种格式文件(csv格式/txt格式/libsvm稀疏txt格式)
- sqlserver导出带数据的脚本文件
- DML之加载和导出数据
- java.util.zip包 OutputStream ZipOutputStream以压缩包的方式导出或下载多个文件,比如图片,文档,Excel表格等
- mysql mysqldump只导出表结构或只导出数据的实现方法
- LabVIEW 将图表数据导出到Excel
- 使用导入导出进行备份和恢复OCR(10g)
- POI导出EXCEL经典实现(转)
- [MEF]第02篇 MEF的导入导出契约