MEF程序設(shè)計指南一:在應(yīng)用程序中宿主MEF
在應(yīng)用程序中宿主MEF其實非常簡單,只需要創(chuàng)建一個組合容器對象(CompositionContainer)的實例,然后將需要組合的部件(Parts)和當前宿主程序添加到容器中即可。首先需要添加MEF框架的引用,既System.ComponentModel.Composition.dll,詳細如下代碼塊:
{
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
通過上面的代碼實現(xiàn)就可以完成MEF的宿主,實際上在使用MEF的開發(fā)過程中并不會如此簡單的應(yīng)用。可能會定義一個或多個導(dǎo)入(Import)和導(dǎo)出(Export)部件,然后通過MEF容器進行組合,其實也可以理解為“依賴注入”的一種實現(xiàn)。比如定義一個圖書接口和一個接口的實現(xiàn)類,在此基礎(chǔ)上使用MEF的導(dǎo)入導(dǎo)出特性:
{
void GetBookName();
}
/// <summary>
/// 導(dǎo)入
/// </summary>
[Export(typeof(IBookService))]
public class ComputerBookService : IBookService
{
public void GetBookName()
{
Console.WriteLine("《Hello Silverlight》");
}
}
如上代碼通過使用MEF的[System.ComponentModel.Composition.Export]對接口的實現(xiàn)進行導(dǎo)出設(shè)置,讓接口的實現(xiàn)以容器部件的方式存在,然后通過組合容器進行裝配加載,這個過程中就包括了接口的實例化的過程。接下來就需要在MEF的宿主程序中定義一個接口的屬性,并為其標注[System.ComponentModel.Composition.Import]特性以實現(xiàn)接口實現(xiàn)類的導(dǎo)入。如下代碼塊:
/// 導(dǎo)入接口的實現(xiàn)部件(Part)
/// </summary>
[Import]
public IBookService Service { get; set; }
完成了導(dǎo)入導(dǎo)出的接口與實現(xiàn)的開發(fā)及特性配置,下面就剩下一步組合了,也就是本文提到的將部件和宿主程序自身添加到組合容器中,以實現(xiàn)導(dǎo)入(Import)和導(dǎo)出(Export)的組合裝配。
/// 宿主MEF并組合部件
/// </summary>
private void Compose()
{
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
//將部件(part)和宿主程序添加到組合容器
container.ComposeParts(this,new ComputerBookService());
}
通過以上步驟就完成了MEF的宿主以及一個簡單的部件組合的應(yīng)用示例,下面是本文的完整代碼示例:
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>
/// 導(dǎo)入
/// </summary>
[Export(typeof(IBookService))]
public class ComputerBookService : IBookService
{
public void GetBookName()
{
Console.WriteLine("《Hello Silverlight》");
}
}
class Program
{
/// <summary>
/// 導(dǎo)入接口的實現(xiàn)部件(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官方網(wǎng)站:http://mef.codeplex.com/
浙公網(wǎng)安備 33010602011771號