程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> MEF程序設計指南六:MEF中的目錄服務(DeploymentCatalog)

MEF程序設計指南六:MEF中的目錄服務(DeploymentCatalog)

編輯:關於.NET

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);
}

對於具體如何使用和集中控制,可以通過契約接口和元數據等策略來實現,詳細在後面的文章裡介紹,本篇就介紹到此。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved