文档章节

MEF初步使用

我只是一只小小鸟
 我只是一只小小鸟
发布于 2016/02/17 09:21
字数 543
阅读 42
收藏 0

            MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库。 应用程序开发人员可利用该库发现并使用扩展,而无需进行配置。 扩展开发人员还可以利用该库轻松地封装代码,避免生成脆弱的硬依赖项。 通过 MEF,不仅可以在应用程序内重用扩展,还可以在应用程序之间重用扩展。(摘自MSDN)

            我初步使用后的感受是通过这个应用程序库,我们可以实现接口功能的扩展和自动导入到实例,不需要自己编码对接口进行实现。它可以在指定的程序集中搜索匹配合适的接口实现,然后导入使用。

弄了一个控制台程序,代码不多,很简单,我就直接上代码了。看完了应该会有一个初步认知。

文件一:program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
namespace MEFdemo
{
    class Program
    {

        public IbookService book { get; set; }
        public IFoodService Food { get; set; }
        public CompositionContainer container { get; set; }
        static void Main(string[] args)
        {
            Program pro = new Program();
            pro.Compose();
            pro.book = pro.container.GetExportedValueOrDefault<IbookService>("musicbook");
            Console.WriteLine(pro.book.GetBookName());
            pro.book = pro.container.GetExportedValueOrDefault<IbookService>("historybook");
            Console.WriteLine(pro.book.GetBookName());
            pro.Food = pro.container.GetExportedValueOrDefault<IFoodService>("musicbook");
            if (pro.Food == null)
                pro.Food = pro.container.GetExportedValue<IFoodService>();//GetExportedValue与GetExportedValueOrDefault的区别
                                                                          // 在于后者找不到匹配度的,会异常报错
            Console.WriteLine(pro.Food.GetFoodName());
            Console.WriteLine("当前程序集路径:" + Assembly.GetExecutingAssembly().Location);
            Console.Read();
        }
        /// <summary>
        /// 构造好组合容器
        /// </summary>
        private void Compose()
        {
            var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());//指定程序集目录
            container = new CompositionContainer(catalog);//设定部件容器为该目录下
        }

    }
}

文件二:initalInterFace.cs

using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MEFdemo
{
    public interface IbookService
    {
        string BookName { get; set; }
        string GetBookName();
    }
    public interface IFoodService
    {
        string FoodName { get; set; }
        string GetFoodName();
    }
    [Export("musicbook", typeof(IbookService))]
    public class MusicBook : IbookService
    {
        public string BookName { get; set; }
        public string GetBookName()
        {
            return "MusicBook";
        }
    }
    [Export("historybook", typeof(IbookService))]
    public class HistoryBook : IbookService
    {
        public string BookName { get; set; }
        public string GetBookName()
        {
            return "HistoryBook";
        }
    }
    [Export("musicbook", typeof(IFoodService))]
    public class apple:IFoodService{
        public string FoodName { get; set; }
        public string GetFoodName()
        {
            return "苹果";
        }
    }
}

其实上面的代码,展示了如何使用Export导出实现后的接口,已经取相同名字不同接口,不同名字相同接口的实现情况。

有兴趣的可以耐心看看。

运行结果如下:

 

© 著作权归作者所有

共有 人打赏支持
我只是一只小小鸟
粉丝 14
博文 102
码字总数 53116
作品 1
荆州
程序员
私信 提问
C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo

  在文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架)。单从名字我们不难发现:MEF是专门致力于解决扩展性问题的框架,MSDN中对MEF...

雲霏霏
2014/08/19
0
0
MEF 插件式开发 - 小试牛刀

目录 MEF 简介 实践出真知 面向接口编程 控制反转(IOC) 构建入门级 MEF 相关参考 MEF 简介 Managed Extensibility Framework 即 MEF 是用于创建轻量、可扩展应用程序的库。 它让应用程序开发...

hippieZhou
08/01
0
0
MEF学习笔记

MEF是 Managed Extensibility Framework简称,在计算机的世界什么都会加一个简称,这我们大家已经司空见惯了。从名字我们可以知道它是一个用于管理的可扩展性框架。这是和EL不同的另一种IOC...

zting科技
2017/01/10
0
0
.Net4下的MEF(Managed Extensibility Framework) 架构简介

阅读: 1279 评论: 4 作者: 周 金根 发表于 2010-05-26 21:08 原文链接 在上篇WPF -.Net 4.0解决了DataGrid分组时的内存泄露中说过由于内存泄露问题,OpenExpressApp升级到.Net4平台,然后升...

zhoujg
2010/06/02
0
0
C#可扩展编程之MEF学习笔记(五):MEF高级进阶

好久没有写博客了,今天抽空继续写MEF系列的文章。有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后。 前面四篇讲了MEF的基础知识,学完了前四篇,...

雲霏霏
2014/09/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Netty 备录 (一)

入职新公司不久,修修补补1个月的bug,来了点实战性的技术---基于netty即时通信 还好之前对socket有所使用及了解,入手netty应该不是很难吧,好吧,的确有点难,刚看这玩意的时候,可能都不知道哪里...

_大侠__
昨天
4
0
Django简单介绍和用户访问流程

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由Python写成。 Django遵守BSD版权,初...

枫叶云
昨天
7
0
EOS错误代码及中文释义

本文集汇总了EOS区块链常见错误代码及其含义,完整错误代码集请查看 EOS错误代码集 - 汇智网 EOS错误代码列表如下, <table class="table table-striped"> <thead> <tr><th>错误代码</th><t......

汇智网教程
昨天
2
0
Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)

应用场景 之前我们已经通过《Spring Cloud Stream消费失败后的处理策略(一):自动重试》一文介绍了Spring Cloud Stream默认的消息重试功能。本文将介绍RabbitMQ的binder提供的另外一种重试...

程序猿DD
昨天
4
0
kiss原则

KISS 原则是用户体验的高层境界,简单地理解这句话,就是要把一个产品做得连白痴都会用,因而也被称为“懒人原则”。换句话说来,”简单就是美“。KISS 原则源于 David Mamet(大卫马梅)的电...

NB-One
昨天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部