[MEF]第01篇 MEF使用入门

 

一、演示概述

此演示初步介绍了MEF的基本使用,包括对MEF中的Export、Import和Catalog做了初步的介绍,并通过一个具体的Demo来展示MEF是如何实现高内聚、低耦合和高扩展性的软件架构。
演示中,针对于IBookService接口,有3个不同版本的实现,分别是ComputerBookServiceImp、HistoryBookServiceImp和MathBookServiceImp,然后通过MEF的导入导出及组装机制,分别在这3个版本的实现间替换,而这种替换并未通过配置文件之类的辅助方式,使用起来,确实有它的方便之处。
相关下载(屏幕录像)http://yunpan.cn/cZnDLgASnvTj8 访问密码 39e7
在线播放http://v.youku.com/v_show/id_XOTIwNjkyNjY0.html
温馨提示:如果屏幕录像和代码不能正常下载,可站内留言,或发邮件到524130780@QQ.COM

欢迎有兴趣研究.NET相关技术的网友加QQ群:18507443

二、关键代码

接口定义:

[csharp]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. namespace Interface  
  2. {  
  3.     public interface IBookService  
  4.     {  
  5.         void GetBookName();  
  6.     }  
  7. }  


针对于接口的3个实现,如下代码所示:

[csharp]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. using System;  
  2. using System.ComponentModel.Composition;  
  3. using Interface;  
  4.   
  5.   
  6. namespace ComputerBookServiceImp  
  7. {  
  8.     [Export(typeof(IBookService))]  
  9.     public class ComputerBookService : IBookService  
  10.     {  
  11.         public void GetBookName()  
  12.         {  
  13.             Console.WriteLine("Computer Book");  
  14.         }  
  15.     }  
  16. }  


上面代码除了对接口的实现以外,有两点需要说明的:
1、项目中引用了System.ComponentModel.Composition程序集,使用MEF必须使用该程序集。
2、使用了Export特性标记了ComputerBookService类,并且声明其类型为IBookServivce,通过此特性说明该类是MEF的一个导出部件。

其他两个版本的实现和上面雷同,代码如下:

HistoryBookServiceImp

[csharp]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. using System;  
  2. using System.ComponentModel.Composition;  
  3. using Interface;  
  4.   
  5.   
  6. namespace HistoryBookServiceImp  
  7. {  
  8.     [Export(typeof(IBookService))]  
  9.     public class HistoryBookService : IBookService  
  10.     {  
  11.         public void GetBookName()  
  12.         {  
  13.             Console.WriteLine("History Book");  
  14.         }  
  15.     }  
  16. }  


MathBookServiceImp

[csharp]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. using System;  
  2. using System.ComponentModel.Composition;  
  3. using Interface;  
  4.   
  5.   
  6. namespace MathBookServiceImp  
  7. {  
  8.     [Export(typeof(IBookService))]  
  9.     public class MathBookService : IBookService  
  10.     {  
  11.         public void GetBookName()  
  12.         {  
  13.             Console.WriteLine("Math Book");  
  14.         }  
  15.     }  
  16. }  


然后在修改控制台应用程序Proggram类的代码如下所示:

[csharp]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. using System.ComponentModel.Composition;  
  2. using System.ComponentModel.Composition.Hosting;  
  3. using Interface;  
  4.   
  5.   
  6. namespace HostApp  
  7. {  
  8.     class Program  
  9.     {  
  10.         static void Main(string[] args)  
  11.         {  
  12.             Program program = new Program();  
  13.             program.Compose();  
  14.             program.BookService.GetBookName();  
  15.         }  
  16.   
  17.   
  18.         [Import]  
  19.         public IBookService BookService { get; set; }  
  20.   
  21.   
  22.         /// <summary>  
  23.         /// 通过容器对象将宿主和部件组装到一起。  
  24.         /// </summary>  
  25.         public void Compose()  
  26.         {  
  27.             DirectoryCatalog directoryCatalog = new DirectoryCatalog("imps");  
  28.             var container = new CompositionContainer(directoryCatalog);  
  29.             container.ComposeParts(this);  
  30.         }  
  31.     }  
  32. }  


上面的代码有3点需要说明:
1、通过Import特性标记BookService为一个导入属性,这样MEF的容器在进行宿主和部件组装的时候,将会查找与之匹配的导出部件,然后进行组装。上述代码所查找的是类型与BooService类型相同的导出部件。
2、通过使用DirectoryCatalog类指明要查找的导出部件位于应用程序根目录下的imps子文件夹中。
3、通过CompositionContainer的扩展方法ComposeParts()组装宿主程序和导出部件。在该方法执行前,BookService属性值为null,运行后,如果找到匹配的导出部件,则创建了该导出部件的一个实例。

三、相关资源
1、MSDN官方资料:http://msdn.microsoft.com/zh-cn/library/dd460648(v=vs.110).aspx
2、参考了微软MVP Bēniaǒ的文章《MEF程序设计指南一:在应用程序中宿主MEF》,访问地址:http://www.cnblogs.com/beniao/archive/2010/07/03/1770276.html

转载于:https://www.cnblogs.com/ExMan/p/5487207.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值