随笔-254  评论-3310  文章-48  trackbacks-74

《MEF程序设计指南》博文汇总

  在MEF之前,人们已经提出了许多依赖注入框架来解决应用的扩展性问题,比如OSGI 实现以Spring 等等。在 Microsoft 的平台上,.NET Framework 自身内部包含组件模型和 System.Addin。同时存在若干种开源解决方案,包括 SharpDevelop 的 SODA 体系结构和“控制反转”容器(如 Castle Windsor、Structure Map、Spring.Net 以及Unity)。

  虽然.NET平台下,包括MS在内的各种方案已经遍地开花,但是MEF是第一个随着CLR发布的解决方案。
  官方说法: Managed Extensibility Framework(MEF)是.NET平台下的一个扩展性管理框架,它是一系列特性的集合,包括依赖注入(DI)以及Duck Typing等。MEF为开发人员提供了一个工具,让我们可以轻松的对应用程序进行扩展并且对已有的代码产生最小的影响,开发人员在开发过程中根据功能要求定义一些扩展点,之后扩展人员就可以使用这些扩展点与应用程序交互;同时MEF让应用程序与扩展程序之间不产生直接的依赖,这样也允许在多个具有同样的扩展需求之间共享扩展程序。

 

  了一个月左右的休息时间将官方提供的MEF程序设计指南(The MEF Programming Guide)以及自己使用中的一些经验进行了整理,为了方便大家阅读特将此系列博文进行汇总,详细如下博文列表。


  MEF程序设计指南一:在应用程序中宿主MEF

  本篇通过一个简单的应用实例介绍了如何在应用程序中宿主MEF,以及最基本的导入、导出和部件组合的应用。 

 

  MEF程序设计指南二:Silverlight中使用CompositionInitializer宿主MEF

  本篇介绍了如何在Silverlight中使用CompositionInitializer宿主MEF,并通过不同的导入导出配置,演示了MEF的动态装载配件组合和一些简单的应用案例。 

 

  MEF程序设计指南三:MEF中组合部件(Composable Parts)与契约(Contracts)的基本应用

  本篇介绍了如何定义组合部件(Composable Parts)和契约(Contracts),以及基于契约的的多重组件部件的相关应用,包括接口的多实现,如何使用ImportManyAttribute特性通过契约获取接口的多重实现实例等。最后还介绍了通过契约进行约束,实现装配指定契约的部件。

 

  MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)

  本篇介绍了如何使用MEF声明导出(Exports)与导入(Imports),包括类、字段、属性以及方法级别的部件导出、导出的应用。

 

  MEF程序设计指南五:迟延(Lazy)加载导出部件(Export Part)与元数据(Metadata)

  本篇介绍了MEF中的迟延加载(Lazy)机制和元数据(Metadata)导出功能特性。

 

  MEF程序设计指南六:MEF中的目录服务(DeploymentCatalog)

  对于MEF的目录服务MEF分别为WPF和Silverlight提供了不同的目录机制。使用目录的主要功能就是方便实现程序部件的装载,以及动态的组合应用程序部件等功能,更可以非常方便的得到程序部件的程序集、导出部件等相关数据。

 

  MEF程序设计指南七:使用目录(Catalog)动态装载xap与目录筛选(Filtered Catalog)

  如果不使用MEF进行托管扩展处理,只有通过WebClient进行程序包的下载、解析。实际上MEF的动态下载的底层实现一样是使用的WebClient,然后利用AggregateCatalog进行动态组合。   

 

  MEF程序设计指南八:部件生命周期(Parts Lifetime)托管

  MEF中的每一个可进行动态装配的导出部件都是具有生命周期的,在没有特别需求的情况下一般都没有对生命周期进行管理,而实际上MEF已为每一个部件进行了默认的生命周期管理,MEF的生命周期分为三种:Any、Shared及NonShared,被定义在System.ComponentModel.Composition.CreationPolicy枚举对象中。

 

  MEF程序设计指南九:重组(Recomposition)MEF部件

  通过前面八篇程序设计指南的学习,相信大家都知道应用程序部件的组合都是在初始化的时候进行装配的。如果当应用程序已经初始化完成了,此时又有新的部件被导入且进行装配,按照目前的实现方式就无法实现了,我们需要一种可以进行动态装配、动态组合以及可以动态的进行新的部件被装配组合的通知的功能,于此MEF所提供的重组(Recomposition)部件特性就可以派上用场了。

 

  MEF官方网站:http://mef.codeplex.com/

 

相关说明

 本文属学习笔记文章,愿与有志者共同学习交流。欢迎转载,但请在明显地位标记本文的原文连接。  

作      者:Beniao

文章出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

 

 

posted on 2010-08-11 18:15 Bēniaǒ 阅读(10618) 评论(25) 编辑 收藏

评论:
#1楼 2010-08-11 20:21 | Tony Zhou      
开源吗?
 回复 引用 查看   
#2楼 2010-08-11 20:33 | 中华小鹰      
开源。
 回复 引用 查看   
#3楼[楼主] 2010-08-12 11:32 | Bēniaǒ      
@Tony Zhou
MEF就是开源的,微软已经在.NET 4.0中集成了MEF。

 回复 引用 查看   
#4楼[楼主] 2010-08-12 11:33 | Bēniaǒ      
@中华小鹰
MEF就是开源的,微软已经在.NET 4.0中集成了MEF。

 回复 引用 查看   
#5楼 2010-10-09 17:45 | Alan@Net      
学习了,微软出了这么多新东西。。。
 回复 引用 查看   
#6楼[楼主] 2010-10-15 13:33 | Bēniaǒ      
@Alan@Net
微软出的东西多着呢,只是我们知道的少而已。

 回复 引用 查看   
#7楼 2011-01-06 14:45 | 索马      
看了你的MEF,大概有点意思了,可是没事每太真正明白哦.
 回复 引用 查看   
#8楼[楼主] 2011-01-06 23:12 | Bēniaǒ      
@索马
有什么不懂的可以提出来,大家相互讨论,学习。

 回复 引用 查看   
#9楼 2011-09-09 17:36 | (张超)      
这个可用于web应用程序吗?
 回复 引用 查看   
#10楼[楼主] 2011-09-16 21:08 | Bēniaǒ      
@(张超)
可以的。

 回复 引用 查看   
#11楼 2011-09-30 11:07 | 超晨      
用这个是否意味着,A团队开发一套webform,然后B团队就可以不直接动webform的情况下,进行插件开发了?
 回复 引用 查看   
#12楼 2011-10-12 22:28 | 虫子CCC      
很好的资料,但还是一头雾水,再认真看看,不懂再请教你。
 回复 引用 查看   
#13楼[楼主] 2011-10-28 17:37 | Bēniaǒ      
@超晨
引用超晨:用这个是否意味着,A团队开发一套webform,然后B团队就可以不直接动webform的情况下,进行插件开发了?

对的,按照预先架构好的契约模式进行插件式开发。

 回复 引用 查看   
#14楼 2011-11-12 16:27 | stillwater      
LZ好文,写的相当好,看懂了MEF,谢谢LZ,收藏了!
 回复 引用 查看   
#15楼 2011-11-13 23:01 | 硅谷之浪子      
MEF 用的不好很容易造成out of memory 跟null weakreference错误。
 回复 引用 查看   
#16楼 2011-11-13 23:05 | 硅谷之浪子      
引用Bēniaǒ:
@(张超)
可以的。

我觉得WPF跟SL开发想实现DI基本上用MEF跟PRISM,
而web实现DI基本上是用EL&&unity的。

 回复 引用 查看   
#17楼 2011-11-22 17:13 | 皮西博维      
全文拜读了,很有收获,感谢!
 回复 引用 查看   
#18楼[楼主] 2011-11-22 21:07 | Bēniaǒ      
@皮西博维
引用皮西博维:全文拜读了,很有收获,感谢!

一起学习。

 回复 引用 查看   
#19楼 2011-11-30 09:51 | 如是如是      
好文章,清晰明了。
 回复 引用 查看   
#20楼[楼主] 2011-12-01 13:04 | Bēniaǒ      
@如是如是
引用如是如是:好文章,清晰明了。

谢谢支持。

 回复 引用 查看   
#21楼 2011-12-01 17:33 | 要有好的心情      
好资料。
 回复 引用 查看   
#22楼 2011-12-19 15:29 | stillwater      
请教一下楼主,插件之间通信有什么心德!
 回复 引用 查看   
#23楼[楼主] 2011-12-19 20:06 | Bēniaǒ      
@stillwater
引用stillwater:请教一下楼主,插件之间通信有什么心德!

插件之间的通信通过接口服务就可以,也可以通过事件机制。

 回复 引用 查看   
#24楼 2012-02-20 16:47 | olue      
看着楼主的ID怎么那么眼熟,原来是9群的啊
 回复 引用 查看   
#25楼[楼主] 2012-02-21 19:53 | Bēniaǒ      
@olue
引用olue:看着楼主的ID怎么那么眼熟,原来是9群的啊

呵呵,四、六、九,十,十一我都在。

 回复 引用 查看   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1797537 9QM+musDigM=
微软最有价值专家(MVP)

微软技术社区精英(CNTAC)

2010年IT博客大赛50强

微软最有影响力开发者(GDI)


Bing Maps开发一群:75662563
微软技术群-重庆站:97035589
RIA技术联盟QQ群:26917590
昵称:Bēniaǒ
园龄:4年6个月
荣誉:推荐博客
粉丝:413
关注:26

随笔分类(285)

文章分类(14)

积分与排名

  • 积分 - 761107
  • 排名 - 60

最新评论