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

MEF程序設計指南二:Silverlight中使用CompositionInitializer宿主MEF

編輯:關於.NET

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("寫日志到數據庫");
}

本文配套源碼

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