在应用程序中宿主MEF包含创建组合容器对象(CompositionContainer),向组合容器对象添加可组合部件(Parts),包含应用程序宿主本身,最后进行组合。
下面是关于宿主的步骤:
1、创建一个宿主类,在本例中我们使用一个控制台程序,所以宿主就是Program类。
2、添加引用:System.ComponentModel.Composition
3、添加声明:using System.ComponentModel.Composition;
4、创建组合容器对象和组合宿主,添加Compose()方法
5、添加Run()方法用以调用Compose()
6、在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、定义一个或多个宿主将import的exports,下面的代码我们定义一个IMessageSender 接口,同时我们定义一个已经标识为exports,导出为ImessageSender的EmailSender组合部件,通过[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、用[System.ComponentModel.Composition.Import]为宿主类中为每一个import添加属性,下面的例子就是为Program类中的IMessageSender添加import 属性
[Import]
public IMessageSender MessageSender { get; set; }
9、MEF中,有几种方法可以为组合容器对象添加部件(parts),其中一种就是直接添加已存在的组合部件(parts)实例,而第二种,更常见的是我们下面会提及的通过使用目录直接为组合容器对象添加已存在的部件(parts)
在Compose()方法中通过ComposeParts()扩展方法手动添加组合部件(part),在下面的例子中,在当前的Program实例中导入(imports)的EmailSender将被添加到组合容器对象中private void Compose()
{
var container = new CompositionContainer();
container.ComposeParts(this, new EmailSender());
}
通过集合目录添加到组合容器对象
通过使用目录,组合容器对象自动处理创建部件(parts),而不是他们必须显示地添加,在Compose()方法中创建一个目录,接下来创建一个解析器的目录并将其传递给组合容器对象的构造函数。
在下面的例子中,集合目录(AssemblyCatalog)通过传入executing Assembly对象创建对象,我们并没有添加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);
}
}
当上面的代码编译并执行,应用程序装组合IMessageSender import,方法Send()将会被调用,在控制台中输出“Message Sent”
注:以上只是为了方便我自己学习记录,有些地方翻译不到位,唯恐误导读者,如有需要请阅读原文http://mef.codeplex.com/wikipage?title=Hosting%20MEF%20and%20the%20Container&referringTitle=Guide