MEF(Managed Extensibility Framework),所在命名空间是System.ComponentModel.Composition.dll。简单来说,MEF是将符合约定(一般是实现接口)的组件的Parts(类、方法和属性可看作是Part)标记为Export特性,再把这些组件放到与可执行程序同目录的Extensions文件夹中,最后通过把Part标记为Import来引用这些组件,从而为我们创建可扩展组件提供了方便。

以球员踢球为例,体验MEF的工作原理和便捷之处。

● HelloMEF.Lib,类库,包含了一个接口IPlay,即约定
● HelloMEF.BackPlay,类库,包含了一个实现IPlay接口的类Back.cs
● HelloMEF.FowardPlay, 类库,包含一个实现IPlay接口的类Foward.cs
● Portal,控制台应用程序

□ 可扩展的前提是满足约定,即接口

namespace HelloMEF.Lib
{
    public interface IPlay
    {
        string PlaySoccer(string name, string position);
    }
}

□ HelloMEF.BackPlay类库中的Back.cs实现IPlay接口

→引用HelloMEF.Lib组件
→引用System.ComponentModel.Composition组件

using System.ComponentModel.Composition;
using HelloMEF.Lib;

namespace HelloMEF.BackPlay
{
    [Export(typeof(IPlay))]
    public class Back : IPlay
    {
        public string PlaySoccer(string name, string position)
        {
            return string.Format("我是{0},司职{1},我的主要任务是防守和传球~~", name, position);
        }
    }
}

□ HelloMEF.FowardPlay类库中的Foward.cs实现IPlay接口
→引用HelloMEF.Lib组件
→引用System.ComponentModel.Composition组件

using System.ComponentModel.Composition;
using HelloMEF.Lib;

namespace HelloMEF.FowardPlay
{
   [Export(typeof(IPlay))]
    public class Forward : IPlay
    {
        public string PlaySoccer(string name, string position)
        {
            return string.Format("我是{0},司职{1},我的主要任务是传球和射门~~", name, position);
        }
    }
}

□ 控制台程序

→引用HelloMEF.Lib组件
→引用System.ComponentModel.Composition组件
→在可执行文件所在目录,即输出路径下,创建Extensions文件夹

假设,满足约定的一个或多个组件已经方在Extensions文件夹中了,还需要做的大致包括:
→把所有的组件放在Catalog中
→放到CompositionContainer容器中
→在CompositionContainer容器中组合组件
→以Import标记,注入到某个Part上,比如属性上,由程序来决定使用全部或某些组件

using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using HelloMEF.Lib;
 
namespace Portal
{
    class Program
    {
        [ImportMany(typeof(IPlay))]
        public IPlay[] Plays { get; set; }
 
        static void Main(string[] args)
        {
            Program p = new Program();
            p.ShowTeam();
            Console.ReadKey();
        }
 
        public void ShowTeam()
        {
            var catalog = new AggregateCatalog();
            catalog.Catalogs.Add(new DirectoryCatalog(@".\Extensions"));
            var container = new CompositionContainer(catalog);
            container.ComposeParts(this);
            string name = "";
            string position = "";
            while (true)
            {
                Console.WriteLine("输入球员名称");
                name = Console.ReadLine();
                Console.WriteLine("输入球员位置");
                position = Console.ReadLine();
                foreach (IPlay play in Plays)
                {
                    Console.WriteLine(play.PlaySoccer(name, position));
                }
            }
            
        }
    }
}
 

Extensions文件夹只有HelloMEF.FowardPlay.dll,效果如下:

Extensions文件夹中包含HelloMEF.FowardPlay.dll和HelloMEF.BackPlay.dll,效果如下:

MEF(Managed Extensibility Framework)使用全部扩展组件的更多相关文章

  1. MEF(Managed Extensibility Framework)有选择性地使用扩展组件

    在"MEF(Managed Extensibility Framework)使用全部扩展组件"中,客户端应用程序调用了所有的扩展组件,而且如果有新的扩展组件加入,必须先关闭程序,再 ...

  2. 使用Managed Extensibility Framework方便的扩展应用程序

    概述 Managed Extensibility Framework(MEF)是.NET平台下的一个扩展性管理框架,它是一系列特性的集合,包括依赖注入(DI)以及Duck Typing等.MEF为开发 ...

  3. MEF(Managed Extensibility Framework) 微软平台插件化开发

    体验Managed Extensibility Framework精妙的设计   MEF(Managed Extensibility Framework)是.NET Framework 4.0一个重要 ...

  4. MEF(Managed Extensibility Framework)依赖注入学习

    MSDN官方资料,并且微软还提供了SimpleCalculator sample学习样例 http://msdn.microsoft.com/en-us/library/dd460648(v=vs.1 ...

  5. MEF(Managed Extensibility Framework )的入门介绍

    1.什么是MEF MEF是一个来自于微软协作构建扩展应用的新框架,它的目的是在运行中的应用中添加插件.MEF继承于.NET 4.0 Framework平台,存在于各种应用平台的系统程序集中 2.程序集 ...

  6. 体验Managed Extensibility Framework精妙的设计

    MEF(Managed Extensibility Framework)是.NET Framework 4.0一个重要的库,Visual Studio 2010 Code Editor的扩展支持也是基 ...

  7. .Net中的插件框架Managed Extensibility Framework

    Managed Extensibility Framework(MEF)是微软的一个用来扩展.NET应用程序的框架,它最初为了满足Visual Studio里的编辑器的需求,比如说,延迟加载所有东西和 ...

  8. Yii Framework 开发教程Zii组件-Tabs示例

    有关Yii Tab类: http://www.yiichina.com/api/CTabView http://www.yiichina.com/api/CJuiTabs http://blog.cs ...

  9. easyUI扩展组件

    $.parser.plugins.push("aa"); //注册扩展组件 $.fn.aa= function (options, param) {//定义扩展组件 //当opti ...

随机推荐

  1. inherited 的研究。

    结论: 1. inherited默认调用的是父类的同名 同参数方法.(常用,如果是同名 同参数方法 比如 overide 的,可以省略,只写个inherited就可.) 2. 子类的方法里可以 inh ...

  2. Laravel 程序架构设计思路:使用动作类

    当我们谈论到应用程序的架构的时候,经常会问到一个经典的问题,那就是"这段代码应该放在哪里比较好". 因为 Laravel 是一个相当灵活的框架,所以要回答这个问题其实没那么容易.我 ...

  3. Luogu P1160 【队列安排】

    详细的链表讲解 很明显的一个链表裸题 和普通的链表有一个区别就是这个题 可以O(1)插入,O(1)查询 然后我们为了方便,采用双向链表,定义s.f作为指针数组 更详细的解释见代码 #include&l ...

  4. 函数fgets和fputs、fread和fwrite用法小结(转)

    字符串读写函数fgets和fputs: 1.fgets()函数:原型char *fgets(char *s, int n, FILE *stream);从流中读取n-1(n默认1024)个字符之前,如 ...

  5. TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?

    TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小.TreeMap要求存放的键值对映射的键必 ...

  6. 树莓派3B安装远程

    步骤1:树莓派3安装 RDP SERVER 及VNC SERVER sudo apt-get install -y tightvncserver sudo vncserver 最后才知道一定要加上VN ...

  7. Sample ASP.NET IHttpHandler

    LoggerHandler.cs using System; using System.Collections.Generic; using System.Diagnostics; using Sys ...

  8. spring boot在控制台输出彩色日志

    阅读org.springframework.boot.context.config.AnsiOutputApplicationListener 源码发现,通过向JVM传递参数,可以在控制台打印彩色日志 ...

  9. 镣铐之舞:美团安全工程师Black Hat USA演讲

    背景 2018年8月9日,全球顶级安全会议——Black Hat USA在美国拉斯维加斯的曼德勒海湾会议中心落下了帷幕,这场盛会在全球黑客心中几乎等同于“世界杯”和“奥斯卡”一样的存在.这场一年一度的 ...

  10. (四)静态断言(上),assert,NDEBUG, 以及通过宏定义处理文件包含关系

    一.断言:运行时与预处理时 断言(assertion)是一种编程常用的手段.想必大家都见过 assert 吧.今天我们就来了解一下它. 通常情况下,断言就是将一个返回值总是需要为真的判别式放在语句中, ...