MEF程序設計指南二:Silverlight中使用CompositionInitializer宿主MEF
MEF可以在傳統(tǒng)應用程序中使用(包括桌面的Winform、控制臺程序和Web的ASP.NET),也可以在RIA的Silverlight中使用。在Silverlight中只是宿主的方式有所不同,實際上在Silverlight中也可以像傳統(tǒng)應用程序中是方式去宿主,MEF也為Silverlight提供了獨特的宿主方式,使用中需要引用System.ComponentModel.Composition.Initialization.dll動態(tài)鏈接庫。
Silverlight中提供了一種新的宿主MEF的方式,只需要在Application_Startup事件處理函數(shù)中通過調用System.ComponentModel.CompositionInitialization程序集的 System.ComponentModel.Composition.CompositionInitializer類里面的方法一行代碼就可以完成MEF的宿主,這是非常方便、簡單的。詳細如下代碼塊:
{
CompositionInitializer.SatisfyImports(this);
}
下面用一個簡單的示例程序演示下在Silverlight中的MEF的基本應用。比如編寫一個日志組件,分別提供兩種寫日志的方式,既寫文本日志和數(shù)據(jù)庫日志,那么對于需要通過MEF托管的部件可以如下代碼定義:
{
void WriteLog(string message);
}
[Export("TXT",typeof(ILogger))]
public class TXTLogger : ILogger
{
public void WriteLog(string message)
{
System.Console.WriteLine(message);
}
}
[Export("DB",typeof(ILogger))]
public class DBLogger : ILogger
{
public void WriteLog(string message)
{
System.Console.WriteLine(message);
}
}
分別將兩個不同的日志記錄組件都通過[ExportAttribute]進行標注為導出部件,并分別為其設置好通信契約,那么在導入他們的地方就直接通過契約確定分別導入什么類型的日志記錄實現(xiàn)部件??梢酝ㄟ^提供一個統(tǒng)一的門面服務以供系統(tǒng)中統(tǒng)一調用,大致如下代碼所示:
/// 門面服務,聚合不同的日志記錄部件,通過MEF進行組合
/// </summary>
[Export]
public class FacadeService
{
[Import("TXT")]
public ILogger TXTLogger { get; set; }
[Import("DB")]
public ILogger DBLogger { get; set; }
}
實際上門面服務作為一個簡單、單純的輔助類,也是可以通過MEF進行動態(tài)裝配的,如上代碼就將FacadeService也進行了[ExportAttribute]標注,表示此門面類也是一個可裝配的部件,那么在App 中同樣可以通過[ImportAttribute]進行導入的。
/// 導入FacadeService
/// </summary>
[Import]
public FacadeService Service { get; set; }
接下來看看如何調用,F(xiàn)acadeService是被導入在App中的,在應用的時候可以通過Application.Current獲取到當前Silverlight的App對象,總而達到可調用被導入在App中的部件。
{
InitializeComponent();
var service = (Application.Current as App).Service;
service.TXTLogger.WriteLog("寫日志到文本文件");
service.DBLogger.WriteLog("寫日志到數(shù)據(jù)庫");
}
注:本文參考于Hosting MEF in Silverlight using CompositionInitializer ,點擊連接可訪問英文原文。
MEF官方網站:http://mef.codeplex.com/
推薦資源:在應用程序中宿主MEF
浙公網安備 33010602011771號