MEF 除可用於傳統桌面/ Web 應用,亦支援 Silverlight。Silverlight 托管方式不同,需引用 System.ComponentModel.Composition.Initialization.dll,並在 Application_Startup 中一行程式碼完成托管:
private void Application_Startup(object sender, StartupEventArgs e)
{
CompositionInitializer.SatisfyImports(this);
}
定義日誌介面與兩種實作,以契約名稱區分:
public interface ILogger
{
void WriteLog(string message);
}
[Export("TXT", typeof(ILogger))]
public class TXTLogger : ILogger
{
public void WriteLog(string message) => Console.WriteLine(message);
}
[Export("DB", typeof(ILogger))]
public class DBLogger : ILogger
{
public void WriteLog(string message) => Console.WriteLine(message);
}
建立門面服務聚合兩種日誌:
[Export]
public class FacadeService
{
[Import("TXT")]
public ILogger TXTLogger { get; set; }
[Import("DB")]
public ILogger DBLogger { get; set; }
}
在 App.xaml.cs 導入門面服務:
[Import]
public FacadeService Service { get; set; }
頁面中透過 Application.Current 取得服務並呼叫:
public MainPage()
{
InitializeComponent();
var service = (Application.Current as App).Service;
service.TXTLogger.WriteLog("寫日誌到文字檔");
service.DBLogger.WriteLog("寫日誌到資料庫");
}
此模式展示 Silverlight 中 MEF 托管、契約導入與門面模式的標準用法。