[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
[MEF]第03篇 MEF延迟加载导出部件及元数据的更多相关文章
- [MEF]第04篇 MEF的多部件导入(ImportMany)和目录服务
一.演示概述此演示介绍了MEF如何使用ImportMany特性同时导入多个与相同约束相匹配的导出部件,并且介绍了目录服务(Catalog),该服务告知MEF框架可以在什么地方去搜寻与指定约束匹配的导出 ...
- [MEF]第01篇 MEF使用入门
一.演示概述 此演示初步介绍了MEF的基本使用,包括对MEF中的Export.Import和Catalog做了初步的介绍,并通过一个具体的Demo来展示MEF是如何实现高内聚.低耦合和高扩展性的软件架 ...
- [MEF]第05篇 MEF的目录(Catalog)筛选
一.演示概述本示例演示如何使用MEF提供的目录(Catalog)的扩展机制实现可过滤导出部件的自定义目录类.主要是通过继承ComposablePartCatalog基类,并实现接口INotifyCom ...
- [MEF]第02篇 MEF的导入导出契约
一.演示概述此演示介绍了如何为Export指定导出的协议名和类型,以及如何为Import指定导入的协议名和类型,只有确保导出和导入的协议名和类型相匹配了,才能注入成功,否则注入就会失败.相关下载(屏幕 ...
- 【转】MEF程序设计指南五:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)
MEF中使用导出与导入,实质上就是对一个对象的实例化的过程,通过MEF的特性降低了对象的直接依赖,从而让系统的设计达到一种高灵活.高扩展性的效果.在具体的设计开发中,存在着某些对象是不需要在系统运行或 ...
- 第06篇 MEF部件的生命周期(PartCreationPolicy)
一.演示概述 本演示介绍了MEF的生命周期管理,重点介绍了导出部件的三种创建策略,分别是:CreationPolicy.Any.CreationPolicy.Shared.CreationPolicy ...
- MEF 导入(Import)和导出(Export)
前言: MEF不同于其他IOC容器(如:Castle)很重要的原因在于它使用了特性化编程模型(涉及到两个概念:“特性”和“编程模型”). 特性(Attribute):举例来说就是我们在开发过程中在类上 ...
- 实战MEF(3):只导出类的成员
通过前面两篇文章的介绍,相信各位会明白MEF中有不少实用价值.上一文中我们也讨论了导入与导出,对于导出导入,今天我们再深入一点点,嗯,只是深入一点点而已,不会很难的,请大家务必放心,如果大家觉得看文章 ...
- MEF 编程指南(九):部件生命周期
理解 MEF 容器部件生命周期和实现是非常重要的事情.考虑到 MEF 关注可扩展应用程序.这变得尤为重要.生命期可以解释为期望部件的共享性(transitively, its exports) 共 ...
随机推荐
- HTML符号大全
HTML特殊字符编码大全:往网页中输入特殊字符,需在html代码中加入以&开头的字母组合或以&#开头的数字.下面就是以字母或数字表示的特殊符号大全. ...
- python的os.urandom 的用途
Python中os.urandom(n)的作用 随机产生n个字节(0-255)的字符串,可以作为随机加密key使用~ >>> index = os.urandom(2) >&g ...
- Java多态性的理解2
多态的基础理解请参考:http://www.cnblogs.com/liujinhong/p/6003144.html Java的多态一直是我们理解的一个难点.在读过<深入理解Java虚拟机&g ...
- UVA-11396 Claw Decomposition (二分图判定)
题目大意:给一张无向图,能否把它分成若干个“爪”,即,一个点有三个子节点. 题目分析:每个点的度数3是已知的,只需判断一下是不是二分图即可. 代码如下: # include<iostream&g ...
- 普通for循环遍历LinkedList弊端
java开发过程中,用到的最多的List集合就属ArrayList与LinkedList.对于ArrayList的遍历,通常是下面的方法: public static void main(String ...
- Symmetrical Network Acceleration with EBS 12
Andy Tremayne, my esteemed colleague and fellow blogger, has published a new whitepaper that discuss ...
- MySQL相关问题总结
希望此贴能够将MySQL安装周围的问题总结清楚,也免得自己再遇到问题时而不知所措.本帖中所有关于MySQL的问题均涉及到两个平台:Ubuntu 和 Windows(本人没有Mac) 问题1:MySQL ...
- 初识async函数
为什么会出现async函数 首先从大的方面来说,出现async函数时为了解决JS编程中的异步操作,再往具体说就是为了对以往异步编程方法的一种改进,也有人说仅仅只是Generator 函数的语法糖,这个 ...
- LeetCode OJ:Reverse Bits(旋转bit位)
Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...
- igmpproxy源代码学习——igmpProxyInit()
igmpproxy源代码学习--igmpProxyInit()函数详解,igmpproxy初始化 在运行igmpproxy的主程序igmpproxyRun()之前需要对igmpproxy进行一些配置, ...