文档章节

MEF初步使用

我只是一只小小鸟
 我只是一只小小鸟
发布于 2016/02/17 09:21
字数 543
阅读 360
收藏 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导出实现后的接口,已经取相同名字不同接口,不同名字相同接口的实现情况。

有兴趣的可以耐心看看。

运行结果如下:

 

© 著作权归作者所有

我只是一只小小鸟

我只是一只小小鸟

粉丝 18
博文 102
码字总数 53116
作品 1
荆州
程序员
私信 提问
加载中

评论(0)

MEF学习笔记

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

zting科技
2017/01/10
0
0
《MEF程序设计指南》博文汇总

  在MEF之前,人们已经提出了许多依赖注入框架来解决应用的扩展性问题,比如OSGI 实现以Spring 等等。在 Microsoft 的平台上,.NET Framework 自身内部包含组件模型和 System.Addin。同时存...

Bēniaǒ
2010/08/11
0
0
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
2018/08/01
0
0
初窥Managed Extensibility Framework

Managed Extensibility Framework(简称MEF)是一些功能的集合,包括DI,Duck Typing等。这个框架产生的目的是微软想让Framework和Visio Studio等产品支持动态扩展,由命名就可以看出来。最近才...

紫色阴影
2008/06/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

智慧城市交通的要素:路口监管可视化系统的解决方案

前言 随着信息时代的发展变迁,荧幕里呈现的 智慧城市慢慢出现了在现实生活中,很大程度上便利了日常的管理和维护。在智慧城市的大背景下, 智慧交通监管可视化系统是其重要的组成部分,通过...

osc_b8epmas9
36分钟前
19
0
CPU上下文切换以及相关指标的理解

前言 上下文切换这个词一直不理解,看了无数遍就忘了无数遍,知道看到《操作系统导论》这本书,终于有了略微的理解。这也证明了我的方向是没错的,一直认为做运维还是得理解底层的知识,不理...

osc_n1x6m26g
37分钟前
23
0
记一次 React Native 大版本升级过程——从0.40到0.59

去年把公司几个react native 相关的项目升级了下,已经过去一段时间了,这里系统整理下之前的整个过程。 背景 之前到公司的时候发现公司用的还是0.40的版本,据了解,当时项目做的比较早,导...

osc_j34n26zn
38分钟前
13
0
谈谈压测

背景 随着业务不断发展,用户量不断增加,系统负载越来越高。为了解决系统负载问题,我们是不是直接大量增加机器就可以了? 同时,公司业务开展需要,可能需要开展各种营销活动,目前系统是否...

osc_cudh2wh2
40分钟前
19
0
scipy.sparse的一些整理

一、scipy.sparse中七种稀疏矩阵类型 1、bsr_matrix:分块压缩稀疏行格式 介绍   BSR矩阵中的inptr列表的第i个元素与i+1个元素是储存第i行的数据的列索引以及数据的区间索引,即indices[i...

osc_auwur47t
42分钟前
27
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部