zoukankan      html  css  js  c++  java
  • [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

  • 相关阅读:
    团队开发第二阶段
    每日日报
    每日日报
    每日日报
    每日日报
    每日日报
    C++类class和结构体struct区别
    c++简单的类的建立与参数的两种传递方法
    C++ 使用delete删除指针
    暂存
  • 原文地址:https://www.cnblogs.com/ExMan/p/5487207.html
Copyright © 2011-2022 走看看