建立MEF包含CompositionContainer的執行個體,給它增加Composable part(包含程式自己本身),然後組合。
以下是建立的順序
- 建立宿主類。在樣本中,我們使用命令列程式,所以宿主在Program類。
- 增加System.ComponentModel.Composition引用。
- 增加如下命名空間:using System.Component.Composition
- 增加Compose()方法,建立container執行個體,然後組裝。
- 增加Run()方法,它調用Compose()。
- 在Main()函數中,啟動宿主。
注意,對於ASP.NET和WPF程式來講,建立宿主類沒有必要。
請看代碼:
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
using System;
public class Program
{
public static void Main(string[] args)
{
Program p = new Program();
p.Run();
}
public void Run()
{
Compose();
}
private void Compose()
{
var container = new CompositionContainer();
container.ComposeParts(this);
}
}
7. 定義一個或多個exports。這段代碼展示了我們定義了一個IMessageSender介面。我們也定義了EmailSender composable part,它exports一個IMessageSender,並用[System.ComponentModel.Composition.Export]標籤聲明了。
public interface IMessageSender
{
void Send(string message);
}
[Export(typeof(IMessageSender))]
public class EmailSender : IMessageSender
{
public void Send(string message)
{
Console.WriteLine(message);
}
}
8. 給宿主類增加屬性,並用Import標籤標記。
[Import]
public IMessageSender MessageSender { get; set; }
9. 增加part到container。在MEF中,有很多種方式來做。一種是直接增加composable part的執行個體。另一種,更常見的是使用catalog。
直接增加composable part執行個體
在Compose()方法手動增加一個composable part,使用ComposePart()擴充方法。如下:
private void Compose()
{
var container = new CompositionContainer();
container.ComposeParts(this, new EmailSender());
}
使用AssemblyCatalog來增加Container
使用catablog,container自動處理建立的parts,而不是顯示增加他們。為了這樣做,在Compose()方法中建立一個catalog。然後傳入container的建構函式。
在這個例子中,AssemblyCatalog顯示將正在執行的程式集傳入建構函式。我們沒有增加EmailSender的執行個體。
private void Compose()
{
var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
如下是全部代碼:
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
using System;
public class Program
{
[Import]
public IMessageSender MessageSender { get; set; }
public static void Main(string[] args)
{
Program p = new Program();
p.Run();
}
public void Run()
{
Compose();
MessageSender.Send("Message Sent");
}
private void Compose()
{
AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
}
public interface IMessageSender
{
void Send(string message);
}
[Export(typeof(IMessageSender))]
public class EmailSender : IMessageSender
{
public void Send(string message)
{
Console.WriteLine(message);
}
}