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 |