zoukankan      html  css  js  c++  java
  • [MEF]第03篇 MEF延迟加载导出部件及元数据


    一、演示概述
    此演示介绍了MEF的延迟加载及元数据相关的内容。
    在实际的设计开发中,存在着某些对象是不需要在系统运行或者附属对象初始化的时候进行实例化的,
    只需要在使用到它的时候才会进行实例化,这种方式就可以理解为对象的迟延初始化,或者叫迟延加载。 对于提升系统的性能大有裨益呀!
    另外,还可以为导出的部件添加元数据,以便在代码中提供更加灵活的扩展办法,或获取更多的相关信息。甚至,还可以自定义元数据的接口,无论是定义还是使用都非常的方便。
    相关下载(屏幕录像)http://yunpan.cn/cZCfFBypPSLCh  访问密码 0ce2
    在线播放
    温馨提示
    如果屏幕录像和代码不能正常下载,可站内留言,或发邮件到524130780@QQ.COM

    欢迎有兴趣研究.NET相关技术的网友加QQ群:18507443

    二、延迟加载
    延迟加载在导出部件处的设置没什么变化,保持原有的设置即可。如下代码所示:

    [csharp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. [Export("Oracal", typeof(ILogger))]  
    2. public class OracalLogger : ILogger  
    3. {  
    4.     public void WriteLog(string message)  
    5.     {  
    6.         Console.WriteLine("Oracal Logger => {0}", message);  
    7.     }  
    8. }  

    在导入的时候,需要使用.NET提供的Lazy类来完成。代码如下:

    [csharp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. [Import("Oracal", typeof(ILogger))]  
    2. public Lazy<ILogger> OracalLogger { get; set; }  

    通过Lazy封装的对象即自动提供了延迟加载的机制。访问对象的方式也略微有所改变,当然不能直接通过属性(上例中的OracalLogger)进行访问,而是需要通过Lazy<T>.Value来访问,此属性值包含的即使延迟加载的对象。
    另外Lazy<T>.IsValueCreated属性提供了判断对象是否加载的功能,如果为true则表示对象已加载,否则为未加载。

    三、元数据
    关于MEF的数据的使用,首先需要给导出部件添加ExportMetadata特性,用来设置要添加的元数据。如下面代码所示:

    [csharp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. [ExportMetadata("Name", "Xml")]  
    2. [ExportMetadata("Description", "使用的是XML来记录日志")]  
    3. [Export("Xml", typeof(ILogger))]  
    4. public class XmlLogger : ILogger  
    5. {  
    6.     public void WriteLog(string message)  
    7.     {  
    8.         Console.WriteLine("Xml Logger => {0}", message);  
    9.     }  
    10. }  

    如上代码所示,首先ExportMetadata特性可以被重复的添加到多个多出部件,另外,该特性的两个参数非常的类似于键值对,第一个参数为元数据的名称,第二个参数则是元数据的实际内容。
    至此,导出部件所需要做的修改就算是完成了。接下来,就该修改导入了。如下代码所示:

    [csharp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. [Import("Xml", typeof(ILogger))]  
    2. public Lazy<ILogger, IMetadata> XmlLogger { get; set; }  

    如上代码所示,仍然使用的Lazy类。其中第二个泛型参数表示的就是元数据的接口。定义大致如下:

    [csharp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. public interface IMetadata  
    2. {  
    3.     string Description { get; }  
    4.     string Name { get; }  
    5. }  

    仔细对比后会发现,该接口中的成员名称和导出部件中的元数据名称是如此的一致。实是上不仅其名称要保持一致,连数据类型也要保持一致,否则导入的时候将会引发异常。

    经过如上的代码修改后,通过导入元素(上例中的XmlLogger属性)会有一个名为Metadata的属性,即Lazy<T, TMeta>.Metadata,通过它即可访问导出部件中的各个元数据了。
    如下代码所示:

    [csharp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. Console.WriteLine(program.XmlLogger.Metadata.Name);  
    2. 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

  • 相关阅读:
    svn创建分支问题.未提交就创建分支
    中文繁简字对照表(继) 保留一简多繁的映射关系
    struts2配置json,警告:no result type defined for type 'json'
    eclipse更改修改编码方式的几种方法
    URLConnection简单爬虫(转)
    eclipse更改文件编码方式
    java学习笔记十——堆和栈的理解
    java学习笔记九——构造函数、方法重写、重载
    java学习笔记三——数据类型转换
    java学习笔记二——数据类型
  • 原文地址:https://www.cnblogs.com/ExMan/p/5487209.html
Copyright © 2011-2022 走看看