光脚丫思考的专栏

一、演示概述

此演示初步介绍了MEF的基本使用,包括对MEF中的Export、Import和Catalog做了初步的介绍,并通过一个具体的Demo来展示MEF是如何实现高内聚、低耦合和高扩展性的软件架构。演示中,针对于IBookService接口,有3个不同版本的实现,分别是ComputerBookServiceImp、HistoryBookServiceImp和MathBookServiceImp,然后通过MEF的导入导出及组装机制,分别在这3个版本的实现间替换,而这种替换并未通过配置文件之类的辅助方式,使用起来,确实有它的方便之处。相关下载(屏幕录像):访问密码 39e7在线播放:温馨提示:如果屏幕录像和代码不能正常下载,可站内留言,或发邮件到524130780@QQ.COM欢迎有兴趣研究.NET相关技术的网友加QQ群:18507443二、关键代码接口定义:namespace Interface{public interface IBookService{void GetBookName();}}针对于接口的3个实现,如下代码所示:using System;using System.ComponentModel.Composition;using Interface;namespace ComputerBookServiceImp{[Export(typeof(IBookService))]public class ComputerBookService : IBookService{public void GetBookName(){Console.WriteLine("Computer Book");}}}上面代码除了对接口的实现以外,有两点需要说明的:1、项目中引用了System.ComponentModel.Composition程序集,使用MEF必须使用该程序集。2、使用了Export特性标记了ComputerBookService类,并且声明其类型为IBookServivce,通过此特性说明该类是MEF的一个导出部件。其他两个版本的实现和上面雷同,代码如下:HistoryBookServiceImpusing System;using System.ComponentModel.Composition;using Interface;namespace HistoryBookServiceImp{[Export(typeof(IBookService))]public class HistoryBookService : IBookService{public void GetBookName(){Console.WriteLine("History Book");}}}MathBookServiceImpusing System;using System.ComponentModel.Composition;using Interface;namespace MathBookServiceImp{[Export(typeof(IBookService))]public class MathBookService : IBookService{public void GetBookName(){Console.WriteLine("Math Book");}}}然后在修改控制台应用程序Proggram类的代码如下所示:using System.ComponentModel.Composition;using System.ComponentModel.Composition.Hosting;using Interface;namespace HostApp{class Program{static void Main(string[] args){Program program = new Program();program.Compose();program.BookService.GetBookName();}[Import]public IBookService BookService { get; set; }/// <summary>/// 通过容器对象将宿主和部件组装到一起。/// </summary>public void Compose(){DirectoryCatalog directoryCatalog = new DirectoryCatalog("imps");var container = new CompositionContainer(directoryCatalog);container.ComposeParts(this);}}}上面的代码有3点需要说明:1、通过Import特性标记BookService为一个导入属性,这样MEF的容器在进行宿主和部件组装的时候,将会查找与之匹配的导出部件,,然后进行组装。上述代码所查找的是类型与BooService类型相同的导出部件。2、通过使用DirectoryCatalog类指明要查找的导出部件位于应用程序根目录下的imps子文件夹中。3、通过CompositionContainer的扩展方法ComposeParts()组装宿主程序和导出部件。在该方法执行前,BookService属性值为null,运行后,如果找到匹配的导出部件,则创建了该导出部件的一个实例。三、相关资源1、MSDN官方资料:(v=vs.110).aspx2、参考了微软MVP Bēniaǒ的文章《MEF程序设计指南一:在应用程序中宿主MEF》,访问地址:

微风吹过,海面上金光闪闪,泛起一道道美丽的浪花,

光脚丫思考的专栏

相关文章:

你感兴趣的文章:

标签云: