DotNet 4 学习笔记之 1-------------MEF (Managed Extensibility Framework)
.net 4 和对应的vs2010已经出来一阵子了.从最早的beta1到如今的RC,已愈发向正式版靠拢.
最近闲来无事,又似乎有些假日综合症之嫌,于是静下心来对dotnet 4.0从头到底好好研究一下.
首先我们来研究MEF 。
所谓MEF (Managed Extensibility Framework)
通常,由于应用需求的变化频繁,导致应用软件可扩展性越做越差,很难加入新的功能.在NET4.0中,加入了MEF(托管可扩展框架)就为了解决了简化可扩展应用程序和组件的设计这个问题.
由于MEF已经包含在.net 4.0之中,我们不需要额外下载其类库,当然,如果对其实现原理感兴趣,可以在http://www.codeplex.com/MEF看到其源代码.
如何创建一个MEF Application
通常,创建一个MEF Application需要实现以下几个步骤.
- 使用[Import]属性标记可扩展的地方,并将其已接口形式表达
- 创建进行扩展的组件,实现(1)的接口的同时使用[Export]标记
我们接着用一个简单的例子来做以上2步。
首先,我们申明了一个可用于扩展的属性Message,并实现了其调用时的方法Do().
注意,Import属性是在System.ComponentModel.Composition下,需要在项目中引入System.ComponentModel
{
[Import]
public string Message { get; set; }
public void Compose()
{
CompositionContainer container = new CompositionContainer();
CompositionBatch batch = new CompositionBatch();
batch.AddPart(new Extension1());
batch.AddPart(this);
container.Compose(batch);
}
public void Do()
{
Console.WriteLine(Message);
Console.ReadKey();
}
}
接着,我们要具体实现一个被扩展的对象。
{
[Export]
public string Message
{
get
{
return "I am extension 1";
}
}
}
这样,在我们需要正式初始化MEFTest实例并调用其Do方法之前,自然需要一个方法将可扩展的Message对象“绑定”到Message这个接口之上。而这就是 Compose()方法的作用。在其之中,我们创建了一个CompositionContainer容器用于绑定该属性。
请注意,任何Export标记过的都必须有对应的Import在容器中,反之却可以通过 Compose()。
关于实际应用
通常,我们在实际应用中没有上文来的这么简单。MEF支持通过程序集或目录(DirectoryCatalog)或2者结合等方式绑定可扩展的对象。
new DirectoryCatalog(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)));
如果在新建CompositionContainer容器时,使用了DirectoryCatalog,则在该目标路径下的所有程序集都会被遍历查询,用于寻找实现Import接口的具体class。
当然,请在标记Export时使用[Export(typeof(接口))]来精确定位。
另外,通常使用时,我们需要使用一些特定的元数据(metadata)来进一步描述或说明某些特定接口(如果安全性,速度等)。我们可以使用PartMetadata标记class,使用ExportMetadata标记实现方法。
总结
本文主要介绍了何为MEF,以及MEF的简单应用。望广大网友指正。
To Be Continue....
-----------------------------------------------------------------------------------------------------------------
| 戴佳顺 | msn:edwin19861218@hotmail.com | QQ:1961218 | Web:http://www.dumuzi.cn |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器