[MEF]第03篇 MEF延迟加载导出部件及元数据

一、演示概述

此演示介绍了MEF的延迟加载及元数据相关的内容。

在实际的设计开发中,存在着某些对象是不需要在系统运行或者附属对象初始化的时候进行实例化的,

只需要在使用到它的时候才会进行实例化,这种方式就可以理解为对象的迟延初始化,或者叫迟延加载。 对于提升系统的性能大有裨益呀!

另外,还可以为导出的部件添加元数据,以便在代码中提供更加灵活的扩展办法,或获取更多的相关信息。甚至,还可以自定义元数据的接口,无论是定义还是使用都非常的方便。

相关下载(屏幕录像)http://yunpan.cn/cZCfFBypPSLCh  访问密码 0ce2

在线播放

温馨提示

如果屏幕录像和代码不能正常下载,可站内留言,或发邮件到[email protected]

欢迎有兴趣研究.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

时间: 2024-12-15 01:49:38

[MEF]第03篇 MEF延迟加载导出部件及元数据的相关文章

[MEF]第04篇 MEF的多部件导入(ImportMany)和目录服务

一.演示概述 此演示介绍了MEF如何使用ImportMany特性同时导入多个与相同约束相匹配的导出部件,并且介绍了目录服务(Catalog),该服务告知MEF框架可以在什么地方去搜寻与指定约束匹配的导出部件,即导出部件位于什么地方. 相关下载(屏幕录像.代码):http://yunpan.cn/cVdN5JHeQrJgI 访问密码 065d 温馨提示:如果屏幕录像和代码不能正常下载,可站内留言,或发邮件到[email protected] 欢迎有兴趣研究.NET相关技术的网友加QQ群:18507

[MEF]第01篇 MEF使用入门

一.演示概述 此演示初步介绍了MEF的基本使用,包括对MEF中的Export.Import和Catalog做了初步的介绍,并通过一个具体的Demo来展示MEF是如何实现高内聚.低耦合和高扩展性的软件架构.演示中,针对于IBookService接口,有3个不同版本的实现,分别是ComputerBookServiceImp.HistoryBookServiceImp和MathBookServiceImp,然后通过MEF的导入导出及组装机制,分别在这3个版本的实现间替换,而这种替换并未通过配置文件之类

[MEF]第05篇 MEF的目录(Catalog)筛选

一.演示概述 本示例演示如何使用MEF提供的目录(Catalog)的扩展机制实现可过滤导出部件的自定义目录类.主要是通过继承ComposablePartCatalog基类,并实现接口INotifyComposablePartCatalogChanged来完成的. 相关下载(屏幕录像):http://yunpan.cn/cVkvuUNfuDtTX  访问密码 567d 温馨提示:如果屏幕录像和代码不能正常下载,可站内留言,或发邮件到[email protected] 欢迎有兴趣研究.NET相关技术

[MEF]第02篇 MEF的导入导出契约

一.演示概述 此演示介绍了如何为Export指定导出的协议名和类型,以及如何为Import指定导入的协议名和类型,只有确保导出和导入的协议名和类型相匹配了,才能注入成功,否则注入就会失败. 相关下载(屏幕录像):http://yunpan.cn/cZIxLTJgGhpvp  访问密码 3b86 在线播放: 温馨提示:如果屏幕录像和代码不能正常下载,可站内留言,或发邮件到[email protected] 欢迎有兴趣研究.NET相关技术的网友加QQ群:18507443 二.关键代码 包含协议名和类

【转】MEF程序设计指南五:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)

MEF中使用导出与导入,实质上就是对一个对象的实例化的过程,通过MEF的特性降低了对象的直接依赖,从而让系统的设计达到一种高灵活.高扩展性的效果.在具体的设计开发中,存在着某些对象是不需要在系统运行或者的附属对象初始化的时候进行实例化的,仅仅只需要在需要使用到他的时候才会进行实例化,从系统的上来说这也是提高系统性能的一种可行的实现方式,这种方式就可以理解为对象的迟延初始化,或者叫迟延加载.MEF也对此使用场景提供了完善的实现机制,下面来看看在MEF中的迟延初始化是如何使用的. namespace

第06篇 MEF部件的生命周期(PartCreationPolicy)

一.演示概述 本演示介绍了MEF的生命周期管理,重点介绍了导出部件的三种创建策略,分别是:CreationPolicy.Any.CreationPolicy.Shared.CreationPolicy.NonShared. 相关下载(屏幕录像):http://yunpan.cn/cjZEXHY8N3D6z  访问密码 3912 温馨提示:如果屏幕录像和代码不能正常下载,可站内留言,或发邮件到[email protected] 欢迎有兴趣研究.NET相关技术的网友加QQ群:18507443 二.部

实战MEF(3):只导出类的成员

过前面两篇文章的介绍,相信各位会明白MEF中有不少实用价值.上一文中我们也讨论了导入与导出,对于导出导入,今天我们再深入一点点,嗯,只是深入一点点而已,不会很难的,请大家务必放心,如果大家觉得看文章枯燥,不妨一边喝牛奶一边阅读. 上一文中我们都是把整个类型(整个类)进行导出,不过有时候,我们可能会考虑只导出类的某些成员,比如某个属性或某个字段等. 我们还是少说理论,免得大家喝不下牛奶,还是直接上菜吧.为了便于测试,以下示例把组件都写在当前程序集中,也就是在同一个项目,然后用AssemblyCat

Java从入门到精通——数据库篇Mongo DB 导出,导入,备份

一.概述    本篇博客为大家讲述一下Mongo DB是如何导入导出数据,还有就是备份数据的.    在下面操作的时候需要把Mongo DB的服务端打开才能操作. 二.导出.    MongoDB的导出非常简单打开cmd 输入下面命令    mongoexport -d foobar -c persons -o D:/persons.json    如果要导入其他主机的数据库文档则这样写    mongoexport --host 192.168.0.16 --port 37017 三.导入  

从苏宁电器到卡巴斯基(后传)第03篇:我与鱼C论坛的是是非非

前言与铺垫 当我刚读研一的时候,对自己的未来还是非常迷茫的.尽管我读的是数字媒体技术专业,但是我对这一行根本就不感兴趣,对于平面设计.三维建模以及游戏引擎的使用这一类知识根本就不会,也不太想学(由于我的导师是这个领域的,因此我必须得学一些,毕业设计也得做这个方向的).当时我的初步想法是学好C/C++语言,毕业之后做一个C程序员,如果学得好的话,也许会去应聘游戏公司,做一名游戏引擎开发工程师.尽管当时我是这么想的,但也没有付出实际行动,因为总感觉自己不是编程的料,没那个脑子.加上我的本科还是学营销