MEF可以在傳統應用程序中使用(包括桌面的Winform、控制台程序和Web的ASP.NET),也可以在RIA的Silverlight中使用。在 Silverlight中只是宿主的方式有所不同,實際上在Silverlight中也可以像傳統應用程序中是方式去宿主,MEF也為Silverlight提供了獨 特的宿主方式,使用中需要引用 System.ComponentModel.Composition.Initialization.dll動態鏈接庫。
Silverlight中提供了一種新的宿主MEF的方式,只需要在Application_Startup事件處理函數中通過調用 System.ComponentModel.CompositionInitialization程序集的 System.ComponentModel.Composition.CompositionInitializer類裡面的 方法一行代碼就可以完成 MEF的宿主,這是非常方便、簡單的。詳細如下代碼塊:
private void Application_Startup(object sender, StartupEventArgs e)
{
CompositionInitializer.SatisfyImports(this);
}
下面用一個簡單的示例程序演示下在Silverlight中的MEF的基本應用。比如編寫一個日志組件,分別提供兩種寫日志的方式,既寫文本 日志和數據庫日志,那麼對於需要通過MEF托管的部件可以如下代碼定義:
public interface ILogger
{
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]進行標注為導出部件,並分別為其設置好通信契約,那麼在導入他們的地方 就直接通過契約確定分別導入什麼類型的日志記錄實現部件。可以通過提供一個統一的門面服務以供系統中統一調用,大致如下代碼所示 :
/// <summary>
/// 門面服務,聚合不同的日志記錄部件,通過MEF進行組合
/// </summary>
[Export]
public class FacadeService
{
[Import("TXT")]
public ILogger TXTLogger { get; set; }
[Import("DB")]
public ILogger DBLogger { get; set; }
}
實際上門面服務作為一個簡單、單純的輔助類,也是可以通過MEF進行動態裝配的,如上代碼就將FacadeService也進行了 [ExportAttribute]標注,表示此門面類也是一個可裝配的部件,那麼在App 中同樣可以通過[ImportAttribute]進行導入的。
/// <summary>
/// 導入 FacadeService
/// </summary>
[Import]
public FacadeService Service { get; set; }
接下來看看如何調用,FacadeService是被導入在App中的,在應用的時候可以通過Application.Current獲取到當前Silverlight的App 對象,總而達到可調用被導入在App中的部件。
public MainPage()
{
InitializeComponent();
var service = (Application.Current as App).Service;
service.TXTLogger.WriteLog("寫日志到文本文件");
service.DBLogger.WriteLog("寫日志到數據庫");
}
本文配套源碼