MEF程序設計指南六:MEF中的目錄服務(DeploymentCatalog)
MEF提供的基于特性的編程模型,可以動態的根據目錄找出程序集里面的所有程序部件。 對于MEF的目錄服務MEF分別為WPF和Silverlight提供了不同的目錄機制。使用目錄的主要功能就是方便實現程序部件的裝載,以及動態的組合應用程序部件等功能,更可以非常方便的得到程序部件的程序集、導出部件等相關數據。
如下代碼塊演示了如何在Silverlight中獲取到當前應用程序的目錄信息,包括了程序集和程序部件等。
var assembly = catalog.Assembly;
var parts = catalog.Parts;
在WPF中可以使用DirectoryCatalog裝配基于目錄的程序部件,Silverlight中則使用DeploymentCatalog來實現目錄的管理,包括程序集下載、裝配等。下面以MEF的目錄在Silverlight中的具體應用為例介紹目錄比較通用的用法,既動態下載與裝配。為了提供系統的靈活性,可以通過抽象接口以高層次的抽象而存在,那么可以通過如下接口來封裝目錄(DeploymentCatalog)。
{
void AddXap(string relativeUri, Action<AsyncCompletedEventArgs> completedAction);
}
在具體實現中就可以對DeploymentCatalog進行深度封裝,以達到靈活應用的目的。并且可以將具體的實現通過[Export]標記為可裝配的程序部件,在需要的地方就可以通過接口式的導入[Import]使用了。
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)的下載和動態裝配,下面為調用封裝的目錄服務接口示例:
{
this.Service.AddXap("MEFTraining.MefCatalogs.Parts.xap", null);
}
對于具體如何使用和集中控制,可以通過契約接口和元數據等策略來實現,詳細在后面的文章里介紹,本篇就介紹到此。
本篇參考于:Using Catalogs 、DeploymentCatalog 示例代碼下載
MEF官方網站:http://mef.codeplex.com/
MEF程序設計指南二:Silverlight中使用CompositionInitializer宿主MEF
MEF程序設計指南三:MEF中組合部件(Composable Parts)與契約(Contracts)的基本應用
MEF程序設計指南四:使用MEF聲明導出(Exports)與導入(Imports)
MEF程序設計指南五:遲延(Lazy)加載導出部件(Export Part)與元數據(Metadata)
浙公網安備 33010602011771號