代码改变世界

C#基础概念之MEF初步

2011-04-27 15:46  杨延成  阅读(6900)  评论(2编辑  收藏  举报

MEF全称Managed Extensibility Framework, 是一个用于创建可扩展的轻型应用程序的库。开发人员可以利用MEF发现并使用扩展,但并不需要配置,而且还可以在应用程序之间重用扩展。应用程序的扩展是一个大型应用程序架构师必须考虑的一个问题。以前的解决办法通常是用配置文件,接口及反射技术来进行实现。而MEF则 提供一种通过隐式发现组件的方法。MEF 组件以声明方式同时指定其依赖项(称为“导入”)及其提供的功能(称为“导出”)。MEF 是 .NET Framework 4 的组成部分,早期的 .NET Framework 版本引入了 Managed Add-in Framework (MAF),旨在使应用程序能够隔离和管理扩展。 MAF 的重点放在比 MEF 稍高的级别,它集中于扩展隔离以及程序集的加载和卸载,而 MEF 则集中于可发现性、扩展性和可移植性。 这两个框架可以顺利地进行互操作,并且单个应用程序可以同时利用这两个框架。

本文简单的测试一下MEF,

首先新建一个控制台工程.并添加MEF框架的引用,既 System.ComponentModel.Composition.dll,然后键入如下代码:

using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
using System;

public class Program
{
/// <summary>
/// Import表明要进行导入,遵守IMessageSender协定
/// </summary>
[Import(typeof(IMessageSender))]
public IMessageSender MessageSender { get; set; }

public static void Main(string[] args)
{
Program p
= new Program();
p.Run();
}

public void Run()
{
//AggregateCatalog用来合并多个catalog
var catalog = new AggregateCatalog();

///使用当前程序集构造AssemblyCatalog,并添加
///AssemblyCatalog对于
AssemblyCatalog assemblyCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
catalog.Catalogs.Add(assemblyCatalog);

///如果还有其他要添加catalog可以继续添加,
///下面注释的2行代码表明,加载当前应用程序下Extensions中的程序集
//string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Extensions");
//catalog.Catalogs.Add(new DirectoryCatalog(path));

///初始化CompositionContainer
var container = new CompositionContainer(catalog);

///从特性化对象的数组创建可组合部件,并在指定的组合容器中组合这些部件
///建立MEF包含CompositionContainer的实例,给它增加Composable part(包含程序自己本身)
///这是CompositionContainer对象的扩展方法
///方法原型:public static void ComposeParts(this CompositionContainer container, params object[] attributedParts);
///要在其中执行组合的组合容器
///要组合的特性化对象的数组
container.ComposeParts(this);
MessageSender.Send(
"Message Sent");
}
}

/// <summary>
/// 定制导入协定
/// </summary>
public interface IMessageSender
{
void Send(string message);
}

/// <summary>
/// Export表明这是一个要导出的类,遵守IMessageSender协定
/// </summary>
[Export(typeof(IMessageSender))]
public class EmailSender : IMessageSender
{
public void Send(string message)
{
Console.WriteLine(message);
}
}


更多内容请参考:

http://msdn.microsoft.com/zh-cn/library/dd460648.aspx

http://mef.codeplex.com/