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. ZK分布式锁(未完 待续)

    实现思路 公平锁:创建有序节点,判断本节点是不是序号最小的节点(第一个节点),若是,则获取锁:若不是,则监听比该节点小的那个节点的删除事件. 非公平锁:直接尝试在指定path下创建节点,创建成功,则说 ...

  2. 用命令对sql进行备份

    利用T-SQL语句,实现数据库的备份与还原的功能 体现了SQL Server中的四个知识点: 1. 获取SQL Server服务器上的默认目录 2. 备份SQL语句的使用 3. 恢复SQL语句的使用, ...

  3. MySQL权限问题

    1.修改MySQL用户密码 .先来看一个PASSWORD()函数,MYSQL使用MD5加密 SELECT PASSWORD(‘root’); .使用mysql数据库,查看用户表 USE mysql; ...

  4. JS正则表达式方法

    使用正则表达式的主要有match,exec,test 1.正则表达式方法test测试给定的字符串是否满足正则表达式,返回值是bool类型的,只有真和假. var user_code = $(" ...

  5. 搜索入门之dfs--经典的迷宫问题解析

    今天来谈一下dfs的入门,以前看到的dfs入门,那真的是入门吗,都是把dfs的实现步骤往那一贴,看完是知道dfs的步骤了,但是对于代码实现还是没有概念.今天准备写点自己的心得,真的是字面意思--入门. ...

  6. RabbitMQ介绍及安装部署

    本节内容: RabbitMQ介绍 RabbitMQ运行原理 RabbitMQ重要术语 三种ExchangeType RabbitMQ集群种类 集群基本概念 镜像模式部署集群 一.RabbitMQ介绍 ...

  7. 【BZOJ】4671: 异或图

    题解 写完之后开始TTTTTTT--懵逼 这道题我们考虑一个东西叫容斥系数啊>< 这个是什么东西呢 也就是\(\sum_{i = 1}^{m}\binom{m}{i}f_{i} = [m ...

  8. HDU - 4474 bfs好题

    这个BFS并不是很好想.. 最主要的一点是每个余数只会被拿出来一次更新其他余数, 然后我用d[ i ]表示 到达 i 这个余数最短需要多长,然后从高位往低位贪心,判断成立的时候忘记了如果0被ban掉了 ...

  9. Ionic Js三:下拉刷新

    在加载新数据的时候,我们需要实现下拉刷新效果,代码如下: HTML 代码 <body ng-app="starter" ng-controller="actions ...

  10. 四、redis系列之主从复制与哨兵机制

    1. 绪言 在现实应用环境中,出于数据容量.容灾.性能等因素的考虑,往往不会只使用一台服务器,而是使用集群的方式.Redis 中也有类似的维持一主多从的方式提高 Redis 集群的高可用性的方案,而其 ...