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

本篇体验使用MEF的ExportMetadata特性,有选择性地使用某些扩展组件,使用Lazy<>,让客户端程序延迟动态加载组件,即使不关闭应用程序,也能调用所有组件。

 

● StudentMEF.Lib, 类库,包含接口IStudent.cs
● StudentMEF.One,类库,包含实现IStudent的类One.cs
● StudentMEF.Two,类库,包含实现IStudent的类One.cs
● StudentMEF.Client,控制台程序

 

□ 所有扩展满足的约定是

namespace StudentMEF.Lib
{
    public interface IStudent
    {
        string GetName();
        int GetScore();
    }
}

 

□ StudentMEF.One类库

→ 需引用StudentMEF.Lib组件
→ 需引用System.ComponentModel.Composition组件

 

using System.ComponentModel.Composition;
using StudentMEF.Lib;

namespace StudentMEF.One
{
    [Export(typeof(IStudent))]
    [ExportMetadata("Type","ONE")]
    public class One : IStudent
    {
        private string _Name;
        private int _Score;

        public One()
        {
            _Name = "jack";
            _Score = 80;
        }
        public string GetName()
        {
            return _Name;
        }

        public int GetScore()
        {
            return _Score;
        }
    }
}

 

□ StudentMEF.Two类库

→ 需引用StudentMEF.Lib组件
→ 需引用System.ComponentModel.Composition组件

 

using System.ComponentModel.Composition;
using StudentMEF.Lib;

namespace StudentMEF.Two
{
    [Export(typeof(IStudent))]
    [ExportMetadata("Type","TWO")]
    public class Two : IStudent
    {
        private string _Name;
        private int _Score;

        public Two()
        {
            _Name = "Bob";
            _Score = 90;
        }

        public string GetName()
        {
            return _Name;
        }

        public int GetScore()
        {
            return _Score;
        }
    }
}

 

□ StudentMEF.Client控制台程序

→ 需引用StudentMEF.Lib组件
→ 需引用System.ComponentModel.Composition组件
→ 需在可执行程序所在目录,即生成路径下,创建Extensions文件夹

 

需要一个帮助类StudentFactory,他的职责包括:

1、为了动态加载Extensions文件夹的所有扩展组件,可以使用Lazy<>来动态实现延迟加载,即只有当客户端程序使用到Extensions文件夹中组件的时候,再去加载这些扩展组件。
2、把扩展组件放到Catalog中,在CompositionContainer构建Part等,这些常规操作,也都需要。
3、提供一个方法,根据元数据ExportMetadata来获取对应的组件。

 

using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using StudentMEF.Lib;

namespace StudentMEF.Client
{
    public class StudentFactory
    {
        [ImportMany]
        private Lazy<IStudent, IDictionary<string, object>>[] Students { get; set; }

        public StudentFactory()
        {
            var catalog = new AggregateCatalog();
            catalog.Catalogs.Add(new DirectoryCatalog(@".\Extensions"));
            var container = new CompositionContainer(catalog);
            container.ComposeParts(this);
        }

        public List<IStudent> GetStudents(string c)
        {
            List<IStudent> result = new List<IStudent>();
            foreach (var student in Students)
            {
                if ((string)student.Metadata["Type"] == c)
                {
                    result.Add(student.Value);
                }
            }
            return result;
        }     
    }
}

Lazy<IStudent, IDictionary<string, object>>中,第二个参数IDictionary<string, object>与ExportMetadata("Type","TWO")对应。

        static void Main(string[] args)
        {
            string c = "";
            while (true)
            {
                Console.WriteLine("输入学生类型:");
                c = Console.ReadLine();
                StudentFactory studentFactory = new StudentFactory();
                List<IStudent> students = studentFactory.GetStudents(c.ToUpper());
                if (students.Count == 0)
                {
                    Console.WriteLine("没有此类型学生~");
                }
                else
                {
                    foreach (IStudent student in students)
                    {
                        Console.WriteLine(string.Format("姓名:{0},分数:{1}",student.GetName(),student.GetScore()));
                    }
                }
            }
            Console.ReadKey();
        }

 

当Extensions文件夹中只有StudentMEF.One.dll组件,输入one,找到匹配,输入two找不到匹配;不关闭控制台程序,把StudentMEF.Two.dll也放入 Extensions文件夹,再输入two,找到匹配。      

MEF(Managed Extensibility Framework)有选择性地使用扩展组件的更多相关文章

  1. MEF(Managed Extensibility Framework)使用全部扩展组件

    MEF(Managed Extensibility Framework),所在命名空间是System.ComponentModel.Composition.dll.简单来说,MEF是将符合约定(一般是 ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. 实战MEF(1)一种不错的扩展方式

    在过去,我们完成一套应用程序后,如果后面对其功能进行了扩展或修整,往往需要重新编译代码生成新的应用程序,然后再覆盖原来的程序.这样的扩展方式对于较小的或者不经常扩展和更新的应用程序来说是可以接受的,而 ...

  9. Extjs 5 可选择日期+时间的组件DateTimeField

    我们都知道ExtJs有日期组件DateField,但直到ExtJs 5.0版本该日期组件也只能选择日期,不能选择时间(具体到时.分.秒),而实际工作中又常常会有需要日期和时间同时选择的需求,我们只能自 ...

随机推荐

  1. (三)Rest风格的资源URL

    第一节:Restful风格的资源URL简介 第二节:SpringMVC对Rest风格的支持 第三节:@PathVariable获取Url变量 第四节:SpringMVC对静态资源的处理 http:// ...

  2. 《精通Python设计模式》学习结构型之享元模式

    这个我日常当中也没有用到过, 真的是游戏行业用得多些? 学习一下, 有个印象. import random from enum import Enum TreeType = Enum('TreeTye ...

  3. 【LOJ】#2292. 「THUSC 2016」成绩单

    题解 神仙dp啊><(也有可能是我菜) 我们发现,想要拿一段区间的话,只和这个区间的最大值和最小值有关系,那么我们考虑,如果一个区间[l,r]我们拿走了一些数后,使它的最小值是a,最大值是 ...

  4. MapReduce的原理及执行过程

    MapReduce简介 MapReduce是一种分布式计算模型,是Google提出的,主要用于搜索领域,解决海量数据的计算问题. MR有两个阶段组成:Map和Reduce,用户只需实现map()和re ...

  5. synchronized锁优化

    1.自旋锁和自适应自旋锁 sync在JDK1.6之前之所以被称为重量级锁,是因为对于互斥同步的性能来说,影响最大的就是阻塞的实现.挂起线程与恢复线程的操作都需要转入内核态中完成.从用户态转入内核态是比 ...

  6. CSUOJ 1868 潜在好友

    Description 小X在搬砖写一个论坛,这个时候老板突然想到一个功能,让小X今天赶快实现.大概就是如果某个人是你好友的好友那么他的头像上面会有特殊的标志.小X想不到较好的办法来解决如何验证两个人 ...

  7. hdu 2275 Kiki & Little Kiki 1 水题

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2275 这个题比较简单,所以就没有测试样例提供给大家,基本把题目的样例过了就可以了 题目大意 给你一串操作, ...

  8. Python与Django的时区问题

    在编码中牵扯到时间问题的时候,总是容易被时区问题搞混,一直以来,都是反复试验应付过去,今天终于搞清楚了个中缘由,一个心结也得以化解. Python 的时区问题 datetime.today() / d ...

  9. ASP.net jQuery调用webservice返回json数据的一些问题

    之前寒假时,试着使用jQuery写了几个异步请求demo, 但是那样是使用的webform普通页面,一般应该是用 webservice 居多. 最近写后台管理时,想用异步来实现一些信息的展示和修改, ...

  10. thinkphp的_STORAGE_WRITE_ERROR_问题

    今天服务器突然报这个问题(上图所示),在thinkphp的官网上也发现有朋友碰到这个问题,定位到应该是Runtime目录没有写权限,然后试着给Application下的Runtime目录 chmod ...