文档章节

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
码字总数 52982
作品 1
荆州
程序员
MEF 插件式开发 - 小试牛刀

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

hippieZhou
08/01
0
0
C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo

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

雲霏霏
2014/08/19
0
0
MEF学习笔记

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

zting科技
2017/01/10
0
0
C#可扩展编程之MEF学习笔记(五):MEF高级进阶

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

雲霏霏
2014/09/24
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

没有更多内容

加载失败,请刷新页面

加载更多

Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
27分钟前
1
0
OSChina 周二乱弹 —— 程序员圣衣

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享Skeeter Davis的单曲《The End of the World》 《The End of the World》- Skeeter Davis 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
42分钟前
4
0
[ python import module ] 导入模块

import moudle_name ----> import module_name.py ---> import module_name.py文件路径 -----> sys.path (这里进行查找文件) # from app.web import Personimport app.web.Person as Pe......

_______-
昨天
3
0
Redis性能问题排查解决手册

一、性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息。通过这些信息来分析文章后面提到的一些性能指标。 nfo命令输出的数据可...

IT--小哥
昨天
1
0
mixin混入

①新建mixin.js文件 const mixin = { methods: { /** * 分页公共方法 */ handleSizeChange(val) { this.pageData.size = val; this.query(); }, hand......

不负好时光
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部