`
jiasongmao
  • 浏览: 666974 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

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

阅读更多

本文章非原创,转载自:

作      者:Beniao

文章出处:http://beniao.cnblogs.com/   或  http://www.cnblogs.com/

 

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

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
namespace MEFTraining.LzayImports
{
    public interface ILogger
    {
        void WriteLog(string message);
    }

    [Export(typeof(ILogger))]
    public class DBLogger : ILogger
    {
        public void WriteLog(string message)
        {
            MessageBox.Show(message);
        }
    }
}
 

 

  通过使用前几篇博文中使用的日志组件为例,在日志记录的具体实现对象上进行对象的导出[Export]配置。如果是使用传统的方式进行部件的导入则如下代码块所示:

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
[Import(typeof(ILogger))]
public ILogger Logger { get; set; }
 

 

  如果需要进行迟延(Lazy)加载,MEF专门提供了用于迟延加载的方式,既使用Lazy类来完成迟延加载,然后通过其他属性Value获取到所加载到的对象。详细的使用如下代码块:

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
public partial class MainPage : UserControl
{
    //传统加载
    [Import(typeof(ILogger))]
    public ILogger Logger { get; set; }
    
    //迟延加载
    [Import]
    public Lazy<ILogger> Service;

    public MainPage()
    {
        InitializeComponent();

        CompositionInitializer.SatisfyImports(this);

        Logger.WriteLog("日志内容");

        Service.Value.WriteLog("日志内容");
    }
}
 

 

  通过调试输出可以得到使用迟延导入的对象的详细信息,下面是通过在命令窗口中输出的Service和Service.Value的详细信息。

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->Service
ThreadSafetyMode
= PublicationOnly, IsValueCreated = true , IsValueFaulted = false , Value = {MEFTraining.LzayImports.DBLogger}
    IsValueCreated: 
true
Service.Value
{MEFTraining.LzayImports.DBLogger}
    [MEFTraining.LzayImports.DBLogger]: {MEFTraining.LzayImports.DBLogger}

 

   迟延加载还支持元数据的导出和导入,主要使用[MetadataAttribute]特性实现,实际开发中可以进行自定义元数据结构,这里以一个空的元数据接口进行元数据的导入应用演示。

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
public interface IMetadata
{
      
}
 

 

  在导出部件中就可以使用元数据特性进行声明,如下简单的应用。

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
[MetadataAttribute]
[Export(typeof(Users))]
public class Users
{
    public string UserName = "张三";
}
 

 

  元数据的导入应用如下代码块所示:

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
public partial class MetadataControl : UserControl
{
    [Import(typeof(Users))]
    public Lazy<Users,IMetadata> Users { get; set; }

    public MetadataControl()
    {
        InitializeComponent();

        //宿主MEF托管扩展容器
        CompositionInitializer.SatisfyImports(this);

        MessageBox.Show(Users.Value.UserName);
    }
}
 

 

  对于的调试输出为下面代码块所示:

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->Users
ThreadSafetyMode
= PublicationOnly, IsValueCreated = true , IsValueFaulted = false Value = {MEFTraining.LzayImports.Users}
    
base  {System.Lazy < MEFTraining.LzayImports.Users > }: ThreadSafetyMode = PublicationOnly, IsValueCreated = true , IsValueFaulted = false , Value = {MEFTraining.LzayImports.Users}
    Metadata : {_proxy_MEFTraining.LzayImports.IMetadata _0174a468
- 9771 - 4271 - a37e - 9a4a83eca6bd}

 

  MEF中也提供了专门用于元数据导入、导出的特性[ExportMetadata],使用ExportMetadata基本可以满足大部分元数据的导出、导入支持。通过修改上面的示例来实现自定义元数据结构的导入、导出应用演示。

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
public interface IMetadata
{
    string Name { get; }
}

[ExportMetadata("Name","李四")]
[Export(typeof(Users))]
public class Users
{
    public string UserName = "张三";
}
 

 

  上面的示例代码演示了通过元数据导出属性名为“Name”,其值为“李四”的元数据信息,并且还定义了一个用于承载元数据结构的结构,接下来就可以通过迟延加载导入,进行元数据的获取了。

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
public partial class MetadataControl : UserControl
{
    [Import(typeof(Users))]
    public Lazy<Users,IMetadata> Users { get; set; }

    public MetadataControl()
    {
        InitializeComponent();

        //宿主MEF托管扩展容器
        CompositionInitializer.SatisfyImports(this);

        MessageBox.Show(Users.Value.UserName);
    }
}
 

 

  下图为允许调试中的截图,可以很清楚的看到,在进行迟延导入的时候已经将导出部件中的元数据信息成功的导入到了当前对象实例属性中。

    

 

  下面是完整的元数据应用实例代码。

<!-- <br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->
namespace MEFTraining.LzayImports
{
    public partial class MetadataControl : UserControl
    {
        [Import(typeof(Users))]
        public Lazy<Users,IMetadata> Users { get; set; }

        public MetadataControl()
        {
            InitializeComponent();

            //宿主MEF托管扩展容器
            CompositionInitializer.SatisfyImports(this);

            MessageBox.Show(Users.Value.UserName);
        }
    }

    public interface IMetadata
    {
        string Name { get; }
    }

    [ExportMetadata("Name","李四")]
    [Export(typeof(Users))]
    public class Users
    {
        public string UserName = "张三";
    }
}
 

 

   除此之外,迟延加载也是支持弱类型的元数据类型的,也可以对元数据进行过滤,这里就不做详细的介绍,有兴趣的朋友可以自己去研究研究。

分享到:
评论

相关推荐

    MEF框架源代码 MEF框架源代码 MEF框架源代码

    5. **元数据(Metadata)**:除了类型本身,导出还可以携带额外的信息,如版本、描述等,这些信息称为元数据。元数据允许更灵活的组件匹配和选择。 6. **部分类(Part)**:在MEF中,组件通常被称为“部分”,因为...

    C#插件系统MEF(好用).rar

    总结,MEF是C#插件系统的一种强大实现,通过其核心概念和特性,如部件容器、导出和导入、元数据以及延迟加载,开发者可以构建出具有高度可扩展性和模块化的应用程序。通过学习和掌握MEF,你可以提高软件的灵活性和可...

    WPF使用MEF方式实现插件化加载控件

    3. **导入元数据**:在插件项目中,使用MEF的 `[Import]` 和 `[Export]` 属性来标记需要导出的类和服务,以及需要导入的依赖项。 4. **主程序配置**:在主程序中,引入MEF库,设置插件目录,并使用 `...

    一个简单的MEF例子

    1. **部件(Part)**:在MEF中,部件是具有依赖注入能力的类,它们可以通过导出(Export)和导入(Import)来与其他部件交互。导出表示部件提供了某种服务,而导入则表示部件需要使用其他部件的服务。 2. **导出...

    WPF下使用MEF导入带参数构造函数的用户控件

    MEF主要包含两个核心概念:Part(部件)和Export(导出),以及Import(导入)。Part代表一个可替换的组件,Export表示Part愿意提供的服务,而Import则声明了一个Part需要依赖的服务。 在WPF中,用户控件(User...

    C# MEF使用实例

    MEF通过引入元数据(Metadata)和导出(Exports)与导入(Imports)的概念,允许代码之间进行松散耦合,从而增强了软件的灵活性和可维护性。 ### 1. MEF的核心概念 #### 导出(Exports) 导出是MEF中的关键概念,...

    C# MEF样例功能测试代码

    `DirectoryCatalog` 和 `AssemblyCatalog` 分别用于从指定目录和程序集中加载导出。 5. **延迟组合(Lazy Composition)** - 使用 `Lazy&lt;T&gt;` 或 `ILazyContext` 可以实现延迟加载,只有当真正需要某个导出项时,才...

    MEF组件式开发,模块化开发

    **MEF组件式开发与模块化开发** MEF(Managed Extensibility Framework)是微软提供的一种组件化开发框架,主要用于构建可扩展的应用程序。MEF允许开发者将应用程序划分为独立的、可替换的组件,这些组件可以动态地...

    MEF Demo1 源代码

    可以使用`[ExportMetadata]`来添加元数据,方便匹配和筛选导出的组件。 3. **容器(Container)**:MEF的容器负责管理和解析组件之间的依赖关系。它会扫描所有可用的导出,并根据导入的需求进行匹配,然后进行组装...

    MEF 动态创建新的实例Demo

    MEF通过元数据(Metadata)来连接这些导入和导出,从而实现组件的灵活组合。 在这个Demo中,我们可能看到以下关键知识点: 1. **容器(Container)**:MEF的核心是容器,它是负责管理组件的生命周期和依赖关系的...

    MEFCatalogs.rar

    1. **部件元数据(Part Metadata)**:每个部件都有元数据,用来描述其属性和行为。元数据可以定义部件的导出(Export)和导入(Import)。导出表示部件提供的服务,而导入则表示部件需要依赖的服务。元数据通过...

    MEF框架学习之旅实例

    MEF框架提供了一种强大的方式来构建可扩展的应用程序,通过导入和导出机制,以及元数据和容器的使用,可以轻松管理和组合各种组件。在实际项目中,MEF可以帮助我们构建灵活、模块化的系统,降低代码的耦合度,增强...

    扩展性MEF.rar111

    5. **元数据(Metadata)**: 允许部件提供附加信息,以便在选择合适的部件时进行筛选。 **MEF的使用场景** 1. **插件架构**: MEF非常适合构建插件式架构,允许用户安装、卸载和更新应用程序的扩展部分。 2. **...

    MEF 插件模型

    3. **导出元数据(Export Metadata)**:除了导出类型本身,还可以附加一些元数据信息,提供更丰富的上下文信息,帮助导入方选择合适的导出对象。 4. **容器(Container)**:MEF的核心是容器,它负责管理所有导入...

    MEF+WPF Demo

    它通过元数据(metadata)和导出(exports)与导入(imports)的概念,实现了组件之间的松耦合。 **WPF(Windows Presentation Foundation)** 是.NET Framework的一部分,用于构建具有丰富图形界面的桌面应用程序...

    MEF体系结构

    除了导出类型之外,你还可以通过`[ExportMetadata]`属性提供额外的元数据,这些元数据可以在运行时用于筛选或分类组件。例如,你可能有一个插件需要知道组件的版本号或作者信息,这些都可以作为元数据包含在导出中。...

    MEF简单应用

    **MEF简单应用** MEF,全称Managed Extensibility Framework,是.NET Framework的一个组件,由微软开发,用于构建可扩展的...在更复杂的场景下,可能需要使用MEF的高级特性,如导出元数据、部分导入和导出工厂等功能。

    WPF prism MEF 架构

    - **插件化**:MEF的插件架构与Prism的模块化理念相结合,使得应用程序能够动态加载和卸载功能模块,提供高度可扩展的平台。 **4. 示例项目Prism4MefDemo** Prism4MefDemo是一个使用Prism和MEF实现的示例项目,它...

    MEF 结合 MVVMLight

    **MEF(Managed Extensibility Framework)与MVVMLight结合使用是现代Windows应用程序开发中的一个常见实践,尤其在WPF和Silverlight项目中。MEF是一个用于构建可扩展应用程序的.NET框架,而MVVMLight则是一个轻量级...

    Managed Extensibility Framework(MEF)

    在`HandT.MEF_Demo.sln`中,我们可能看到一个MEF的演示项目,它包含了多个子项目,如`HandT.MEF_Demo.Web`可能是Web应用程序项目,利用MEF加载和管理插件。`HaneT.MEF_PluginContracts`和`HandT.MEF_Parts_Toolbars`...

Global site tag (gtag.js) - Google Analytics