[MEF]第01篇 MEF使用入门
  efLznNoeVL4Z 2023年11月02日 55 0



一、演示概述

此演示初步介绍了MEF的基本使用,包括对MEF中的Export、Import和Catalog做了初步的介绍,并通过一个具体的Demo来展示MEF是如何实现高内聚、低耦合和高扩展性的软件架构。


演示中,针对于IBookService接口,有3个不同版本的实现,分别是ComputerBookServiceImp、HistoryBookServiceImp和MathBookServiceImp,然后通过MEF的导入导出及组装机制,分别在这3个版本的实现间替换,而这种替换并未通过配置文件之类的辅助方式,使用起来,确实有它的方便之处。







二、关键代码

接口定义:


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的一个导出部件。



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



HistoryBookServiceImp


using System;
using System.ComponentModel.Composition;
using Interface;


namespace HistoryBookServiceImp
{
    [Export(typeof(IBookService))]
    public class HistoryBookService : IBookService
    {
        public void GetBookName()
        {
            Console.WriteLine("History Book");
        }
    }
}



MathBookServiceImp


using 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官方资料:

http://msdn.microsoft.com/zh-cn/library/dd460648(v=vs.110).aspx




【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  9JCEeX0Eg8g4   2023年12月10日   29   0   0 应用程序javaApache
  9JCEeX0Eg8g4   2023年11月27日   30   0   0 DatabaseSystemmongodb