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/

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值