MEF(Managed Extensibility
Framework),所在命名空間是System.ComponentModel.Composition.dll。簡單來說,MEF是将符合約定(一般是實作接口)的元件的Parts(類、方法和屬性可看作是Part)标記為Export特性,再把這些元件放到與可執行程式同目錄的Extensions檔案夾中,最後通過把Part标記為Import來引用這些元件,進而為我們建立可擴充元件提供了友善。
以球員踢球為例,體驗MEF的工作原理和便捷之處。
● HelloMEF.Lib,類庫,包含了一個接口IPlay,即約定
●
HelloMEF.BackPlay,類庫,包含了一個實作IPlay接口的類Back.cs
● HelloMEF.FowardPlay,
類庫,包含一個實作IPlay接口的類Foward.cs
● Portal,控制台應用程式
□ 可擴充的前提是滿足約定,即接口
namespace HelloMEF.Lib
{
public interface
IPlay
{
string PlaySoccer(string name,
string position);
}
}
□
HelloMEF.BackPlay類庫中的Back.cs實作IPlay接口
→引用HelloMEF.Lib元件
→引用System.ComponentModel.Composition元件
using System.ComponentModel.Composition;
using HelloMEF.Lib;
namespace HelloMEF.BackPlay
[Export(typeof(IPlay))]
public class Back : IPlay
public string PlaySoccer(string
name, string position)
{
return
string.Format("我是{0},司職{1},我的主要任務是防守和傳球~~", name, position);
}
HelloMEF.FowardPlay類庫中的Foward.cs實作IPlay接口
namespace HelloMEF.FowardPlay
public class Forward :
string.Format("我是{0},司職{1},我的主要任務是傳球和射門~~", name, position);
□ 控制台程式
→在可執行檔案所在目錄,即輸出路徑下,建立Extensions檔案夾
假設,滿足約定的一個或多個元件已經方在Extensions檔案夾中了,還需要做的大緻包括:
→把所有的元件放在Catalog中
→放到CompositionContainer容器中
→在CompositionContainer容器中組合元件
→以Import标記,注入到某個Part上,比如屬性上,由程式來決定使用全部或某些元件
Extensions檔案夾隻有HelloMEF.FowardPlay.dll,效果如下:
Extensions檔案夾中包含HelloMEF.FowardPlay.dll和HelloMEF.BackPlay.dll,效果如下: