Managed Extensibility Framework(简称MEF)是一些功能的集合,包括DI,Duck Typing等。这个框架产生的目的是微软想让Framework和Visio Studio等产品支持动态扩展,由命名就可以看出来。最近才出来CTP,在这里可以下载。

  MEF到底能够提供什么功能呢?如果是为了DI的话,P&P开发的Unity就足够了,framework小组也不需要开发自己的DI框架。网上的资料也不多,CTP下载包中包括MEF简单的介绍和它如何应用的示例。

下面以几段代码来介绍MEF如何使用。首先是DI:

image

  这里的Import是MEF中的Attribute,表明该Property是注入点,需要从外部注入。

image

  同样Export是MEF的一个Attribute,表明它是需要注入到某地方去的,注入的类型是ILogger。

image

  使用的时候要引入命名空间 using System.ComponentModel.Composition;

  现在的MEF好像不支持构造函数注入只支持属性注入,那么它的可用性就很差,因为很多时候和情况下是需要构造函数注入的。可能也和个人习惯有关系。但是很可能以后的版本会包括构造函数的注入。

  从此看来MEF似乎没有什么出彩的地方,它能做的别人(Unity, Spring.Net)都能做,甚至比它做的还要好。其实MEF的功能远远不止这些,再看下面这个例子:

image  

  MyJob类不变,而ILogger接口加上ContractType的Attribute,字符串表示的是该接口的合约类型。

image

  关键的地方出现了,这里声明了另外一个接口ICustomLogger,它和ILogger的合约类型是一样的。ConsoleLogger实现了ICustomLogger这个接口,Export同样表明它是输出,需要注入到某地方去的。最后是Main函数

image

  MyJob需要的注入的是ILogger类型的对象,而实际注入的是ICustomLogger类型的对象,这就是MEF的Duck Typing,只要两个接口的ContractType一致,方法的签名一致,就可以做到。就我看来这个功能的意义很大,如果某应用是动态可扩展的,那么当我想帮它做扩展的时候,不需要引用它的任何程序集,也不需要实现它的接口。这种扩展就非常独立了,而ContactType和接口签名就作为其中的约束,能够保证扩展的独立性和轻量。

MEF要正式发布估计我们还得等一段时间,且不说它是否够好,值得高兴的是开发者的选择又多了一种。  :D

 posted on 2008-06-10 00:41  紫色阴影  阅读(2963)  评论(9编辑  收藏  举报
我要啦免费统计