MEF程序设计指南六:MEF中的目录服务(DeploymentCatalog)

MEF提供的基于特性的编程模型,可以动态的根据目录找出程序集里面的所有程序部件。 对于MEF的目录服务MEF分别为WPF和 Silverlight提供了不同的目录机制。使用目录的主要功能就是方便实现程序部件的装载,以及动态的组合应用程序部件等功能,更可以非 常方便的得到程序部件的程序集、导出部件等相关数据。

如下代码块演示了如何在Silverlight中获取到当前应用程序的目录信息,包括了程序集和程序部件等。

var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
var assembly = catalog.Assembly;
var parts = catalog.Parts;

在WPF中可以使用DirectoryCatalog装配基于目录的程序部件,Silverlight中则使用 DeploymentCatalog来实现目录的管理,包括程序 集下载、装配等。下面以MEF的目录在Silverlight中的具体应用为例介绍目录比较通用的用法,既动态下载与装配。为了提供系统的灵活 性,可以通过抽象接口以高层次的抽象而存在,那么可以通过如下接口来封装目录 (DeploymentCatalog)。

public interface IDeploymentService
{
     void AddXap(string relativeUri, Action<AsyncCompletedEventArgs> completedAction);
}

在具体实现中就可以对DeploymentCatalog进行深度封装,以达到灵活应用的目的。并且可以将具体的实现通过[Export]标记为可装配 的程序部件,在需要的地方就可以通过接口式的导入[Import]使用了。

[Export(typeof(IDeploymentService))]
public class DeploymentCatalogService : IDeploymentService
{
     private static AggregateCatalog _aggregateCatalog;
     Dictionary<string, DeploymentCatalog> _catalogs;
     public DeploymentCatalogService()
     {
         _catalogs = new Dictionary<string, DeploymentCatalog>();
     }
     public static void Initialize()
     {
         _aggregateCatalog = new AggregateCatalog();
         _aggregateCatalog.Catalogs.Add(new DeploymentCatalog());
         CompositionHost.Initialize(_aggregateCatalog);
     }

     public void AddXap(string relativeUri, Action<AsyncCompletedEventArgs> completedAction)
     {
         DeploymentCatalog catalog;
         if (!_catalogs.TryGetValue(relativeUri, out catalog))
         {
             catalog = new DeploymentCatalog(relativeUri);
             if (completedAction != null)
                 catalog.DownloadCompleted += (s, e) => completedAction(e);
             else
                 catalog.DownloadCompleted += DownloadCompleted;
             catalog.DownloadAsync();
             _catalogs[relativeUri] = catalog;
             _aggregateCatalog.Catalogs.Add(catalog);
         }
     }
     void DownloadCompleted(object sender, AsyncCompletedEventArgs e)
     {
         if (e.Error != null)
         {
             throw new InvalidOperationException(e.Error.Message, e.Error);
         }
     }
}

有了上面的封装,下面只需要一句代码就可以完成独立程序包(.xap)的下载和动态装配,下面为调用封装的目录服务接口示例:

private void button1_Click(object sender, System.Windows.RoutedEventArgs e)
{
     this.Service.AddXap("MEFTraining.MefCatalogs.Parts.xap", null);
}

对于具体如何使用和集中控制,可以通过契约接口和元数据等策略来实现,详细在后面的文章里介绍,本篇就介绍到此。

时间: 2024-10-17 09:38:31

MEF程序设计指南六:MEF中的目录服务(DeploymentCatalog)的相关文章

MEF程序设计指南七

使用目录(Catalog)动态装载xap与目录筛选(Filtered Catalog) 如果不使用MEF进行托管扩展处理,只有通过WebClient进行程序包的下载.解析.实际上MEF的动态下载的底层实现一样是使用的 WebClient,然后利用AggregateCatalog进行动态组合,详细可查看MEF的源代码(路径: Composition.Initialization\System\ComponentModel\Composition\Hosting \DeploymentCatalog

MEF程序设计指南八:部件生命周期(Parts Lifetimeime)托管

MEF中的每一个可进行动态装配的导出部件都是具有生命周期的,在没有特别需求的情况下一般都没有对生命周期进行管理,而实际上 MEF已为每一个部件进行了默认的生命周期管理,MEF的生命周期分为三种:Any.Shared及NonShared,被定义在 System.ComponentModel.Composition.CreationPolicy枚举对象中. namespace System.ComponentModel.Composition { public enum CreationPolicy

MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)

在MEF中,使用[System.ComponentModel.Composition.ExportAttribute]支持多种级别的导出部件配置,包括类.字段.属性以及方法 级别的导出部件,通过查看ExportAttribute的源代码就知道ExportAttribute被定义为 Attribute,并为其设置了使用范围. [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA

MEF程序设计指南二:Silverlight中使用CompositionInitializer宿主MEF

MEF可以在传统应用程序中使用(包括桌面的Winform.控制台程序和Web的ASP.NET),也可以在RIA的Silverlight中使用.在 Silverlight中只是宿主的方式有所不同,实际上在Silverlight中也可以像传统应用程序中是方式去宿主,MEF也为Silverlight提供了独 特的宿主方式,使用中需要引用 System.ComponentModel.Composition.Initialization.dll动态链接库. Silverlight中提供了一种新的宿主MEF

MEF程序设计指南一:在应用程序中宿主MEF

在应用程序中宿主MEF其实非常简单,只需要创建一个组合容器对象(CompositionContainer)的实例,然后将需要组合的部件(Parts) 和当前宿主程序添加到容器中即可.首先需要添加MEF框架的引用,既 System.ComponentModel.Composition.dll,详细如下代码块: private void Compose() { var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); va

MEF程序设计指南五

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

MEF程序设计指南三

MEF中组合部件(Composable Parts)与契约(Contracts)的基本应用 按照MEF的约定,任何一个类或者是接口的实现都可以通过 [System.ComponentModel.Composition.Export] 属性将其他定义组合部件 (Composable Parts),在任何需要导入组合部件的地方都可以通过在特定的组合部件对象属性上使用 [System.ComponentModel.Composition.Import ]实现部件的组合,两者之间通过契约(Contrac

Swift语言指南(六)--可选值

原文:Swift语言指南(六)--可选值 在值可能不存在的情况下使用可选值(optional), 可选值是: · 存在一个值,这个值等于 x 或 · 不存在任何值  注: 在 C 和 Objective-C 中可选值的概念并不存在.Objective-C 中(与可选值)最相近的(概念)是,一个以对象为返回值的方法,也可以返回 nil,nil表示"不存在有效的对象".不过,这规则只对对象有效--对于结构.基本的 C 类型或枚举值无效.对于这些类型,Objective-C 语言的方法通常会

112_《Delphi2高级程序设计指南》

<Delphi2高级程序设计指南> Delphi 教程 系列书籍 (112) <Delphi2高级程序设计指南> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Part1 Part2 Part3 Part4 Part5 Part6 作者: 姚庭宝 出版社: 电子工业出版社 内容简介 Delphi 2.0高级程序设计指南(非常的优秀) 目录 第一部分 基础篇 第一章 Delphi快速入门 第二章 Delphi面向对象的编程方法 第三章 字符串列表及应用 第