Managed Extensibility Framework(简称MEF)是一些功能的集合,包括DI,Duck Typing等。这个框架产生的目的是微软想让Framework和Visio Studio等产品支持动态扩展,由命名就可以看出来。最近才出来CTP,在这里可以下载。
MEF到底能够提供什么功能呢?如果是为了DI的话,P&P开发的Unity就足够了,framework小组也不需要开发自己的DI框架。网上的资料也不多,CTP下载包中包括MEF简单的介绍和它如何应用的示例。
下面以几段代码来介绍MEF如何使用。首先是DI:
这里的Import是MEF中的Attribute,表明该Property是注入点,需要从外部注入。
同样Export是MEF的一个Attribute,表明它是需要注入到某地方去的,注入的类型是ILogger。
使用的时候要引入命名空间 using System.ComponentModel.Composition;
现在的MEF好像不支持构造函数注入只支持属性注入,那么它的可用性就很差,因为很多时候和情况下是需要构造函数注入的。可能也和个人习惯有关系。但是很可能以后的版本会包括构造函数的注入。
从此看来MEF似乎没有什么出彩的地方,它能做的别人(Unity, Spring.Net)都能做,甚至比它做的还要好。其实MEF的功能远远不止这些,再看下面这个例子:
MyJob类不变,而ILogger接口加上ContractType的Attribute,字符串表示的是该接口的合约类型。
关键的地方出现了,这里声明了另外一个接口ICustomLogger,它和ILogger的合约类型是一样的。ConsoleLogger实现了ICustomLogger这个接口,Export同样表明它是输出,需要注入到某地方去的。最后是Main函数
MyJob需要的注入的是ILogger类型的对象,而实际注入的是ICustomLogger类型的对象,这就是MEF的Duck Typing,只要两个接口的ContractType一致,方法的签名一致,就可以做到。就我看来这个功能的意义很大,如果某应用是动态可扩展的,那么当我想帮它做扩展的时候,不需要引用它的任何程序集,也不需要实现它的接口。这种扩展就非常独立了,而ContactType和接口签名就作为其中的约束,能够保证扩展的独立性和轻量。
MEF要正式发布估计我们还得等一段时间,且不说它是否够好,值得高兴的是开发者的选择又多了一种。 :D
【推荐】国内首个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 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?