zoukankan      html  css  js  c++  java
  • 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);
    }

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

      

      本篇参考于:Using CatalogsDeploymentCatalog    示例代码下载

      MEF官方网站:http://mef.codeplex.com/

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

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

             MEF程序设计指南三:MEF中组合部件(Composable Parts)与契约(Contracts)的基本应用

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

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

    相关说明

     本文属学习笔记文章,愿与有志者共同学习交流。欢迎转载,但请在明显地位标记本文的原文连接。  

    作      者:Beniao

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

  • 相关阅读:
    BZOJ 3343 教主的魔法 分块
    HDU 3118 Arbiter 判定奇圈
    Atitit. Attilax企业框架 AEF的发展里程总结
    HDU 2009 整除的尾数 题解
    多态的应用《植物大战僵尸》
    Unity3D调用摄像头显示当前拍摄画面
    oracle下session的查询与删除
    为easyUI的dataGrid加入自己的查询框
    JQuery EasyUI Combobox 实现省市二级联动菜单
    hadoop 2.4.1 集群安装二
  • 原文地址:https://www.cnblogs.com/beniao/p/1780336.html
Copyright © 2011-2022 走看看