C#基础概念之MEF初步
2011-04-27 15:46 杨延成 阅读(6929) 评论(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/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?