在應用程序中宿主MEF其實非常簡單,只需要創建一個組合容器對象(CompositionContainer)的實例,然後將需要組合的部件(Parts) 和當前宿主程序添加到容器中即可。首先需要添加MEF框架的引用,既 System.ComponentModel.Composition.dll,詳細如下代碼塊:
private void Compose()
{
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
通過上面的代碼實現就可以完成MEF的宿主,實際上在使用MEF的開發過程中並不會如此簡單的應用。可能會定義一個或多個導入 (Import)和導出(Export)部件,然後通過MEF容器進行組合,其實也可以理解為“依賴注入”的一種實現。比如定義一個圖書接口和一 個接口的實現類,在此基礎上使用MEF的導入導出特性:
public interface IBookService
{
void GetBookName();
}
/// <summary>
/// 導入
/// </summary>
[Export(typeof(IBookService))]
public class ComputerBookService : IBookService
{
public void GetBookName()
{
Console.WriteLine("《Hello Silverlight》");
}
}
如上代碼通過使用MEF的[System.ComponentModel.Composition.Export]對接口的實現進行導出設置,讓接口的實現以容器部件的方式 存在,然後通過組合容器進行裝配加載,這個過程中就包括了接口的實例化的過程。接下來就需要在MEF的宿主程序中定義一個接口的屬性 ,並為其標注[System.ComponentModel.Composition.Import]特性以實現接口實現類的導入。如下代碼塊:
/// <summary>
/// 導入接口的實現部件 (Part)
/// </summary>
[Import]
public IBookService Service { get; set; }
完成了導入導出的接口與實現的開發及特性配置,下面就剩下一步組合了,也就是本文提到的將部件和宿主程序自身添加到組合容器中 ,以實現導入(Import)和導出(Export)的組合裝配。
/// <summary>
/// 宿主MEF並組合部件
/// </summary>
private void Compose()
{
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
//將部件(part)和宿主程序添加到組合容器
container.ComposeParts(this,new ComputerBookService());
}
通過以上步驟就完成了MEF的宿主以及一個簡單的部件組合的應用示例,下面是本文的完整代碼示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
namespace HostingMef
{
public interface IBookService
{
void GetBookName();
}
/// <summary>
/// 導入
/// </summary>
[Export(typeof(IBookService))]
public class ComputerBookService : IBookService
{
public void GetBookName()
{
Console.WriteLine("《Hello Silverlight》");
}
}
class Program
{
/// <summary>
/// 導入接口的實現部件(Part)
/// </summary>
[Import]
public IBookService Service { get; set; }
/// <summary>
/// 宿主 MEF並組合部件
/// </summary>
private void Compose()
{
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
//將部件(part)和宿主程序添加到組合容器
container.ComposeParts(this,new ComputerBookService());
}
static void Main(string[] args)
{
Program p = new Program();
p.Compose();
p.Service.GetBookName();
}
}
}
注:本文參考Hosting MEF in an application,詳細請大家閱讀原文。
MEF官方網站:http://mef.codeplex.com/