博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MEF简单学习笔记
阅读量:6885 次
发布时间:2019-06-27

本文共 3155 字,大约阅读时间需要 10 分钟。

首先,最基本的还是先要知道MEF是撒,他是干嘛用的:

(1)MEF:全称Managed Extensibility Framework(托管可扩展框架)。

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

(3)工作原理:(这个我看别人的复制黏贴了)

Export(导出): “Export”也就是我们常说的组件或者模块或者服务,它是部件向容器中的其他部件提供的一个值、功能或服务等;

Import(导入): "Import”,既扩展点,是组件,服务等接入系统的窗口,是部件向要通过可用导出满足的容器提出的要求,MEF 支持若干导入类型,其中包括动态导入、延迟导入、必备导入和可选导入;

Contract(协定):是Export和Import的一种约定,一种协议,只有Contract相匹配的Import和Export部件才能组装成功;

Catalog(目录):为了发现可用于组合容器的部件,组合容器将使用“Catalog”。 目录是一个对象,通过它发现可用部件, MEF 提供了用于从提供的类型、程序集或磁盘路径创建Catalog。

Compose(组合):在MEF中,容器将导入与导出匹配的这一过程我们称之为组合,部件由 MEF 组合,MEF 将部件实例化,然后使导出程序与导入程序相匹配。

先弄一个最简单的HelloWorld例子来试一下:

View Code
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ComponentModel.Composition;using System.Reflection;using System.ComponentModel.Composition.Hosting;namespace HelloMEF{    class Program {        public string Message { get; set; }        static void Main(string[] args) {            Program program = new Program();            program.Run();        }        private void Run() {            SimpleHello simpleHello = new SimpleHello();            Message = simpleHello.Message;            Console.WriteLine(Message);            Console.ReadKey();        }    }    public class SimpleHello {        public string Message {            get { return "Hello World!"; }        }    }}

上面这个是普通的提取字符串,但是这样就紧耦合了。要把耦合给去掉,先添加一个引用:System.ComponentModel.Composition.dll,先要有一个宿主,只需要创建一个组合容器对象(CompositionContainer)的实例,然后将需要组合的部件(Parts)和当前宿主程序添加到容器中即可:

var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());            var container = new CompositionContainer(catalog);            container.ComposeParts(this);

然后分别在两个类中加入[Import]和[Export]即可,导入和导出有许多种,譬如如果需要导入多个类的东西的话还需要[ImportMany]等操作:

View Code
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ComponentModel.Composition;using System.Reflection;using System.ComponentModel.Composition.Hosting;namespace HelloMEF {    class Program {        [ImportMany]        public IEnumerable
Message { get; set; } static void Main(string[] args) { Program program = new Program(); program.Run(); } private void Run() { //SimpleHello simpleHello = new SimpleHello(); //Message = simpleHello.Message; var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); container.ComposeParts(this); foreach (var msg in Message) { Console.WriteLine(msg); } Console.ReadKey(); } } public class SimpleHello { [Export] public string Message { get { return "Hello World!"; } } } public class HelloAgain { [Export] public string Message { get { return "Hello World Again!"; } } }}

这个要参考一下这个导入导出的,里面写的还是挺全的:

  

这只是一个最简单的例子。其他的容我再深入的研究下~

转载于:https://www.cnblogs.com/socialdk/archive/2012/10/16/2725937.html

你可能感兴趣的文章
windows下重装xampp并做mysql数据迁移的步骤
查看>>
Java日志组件间关系
查看>>
聊聊前端国际化文案该如何处理
查看>>
JS难点之hoist
查看>>
“独角兽”企业都爱选择腾讯云,背后原因值得考究
查看>>
浅析 Vue 2.6 中的 nextTick 方法
查看>>
199. Binary Tree Right Side View
查看>>
配置SpringBoot方便的切换jar和war
查看>>
2018最佳GAN论文回顾(下)
查看>>
Vue使用element-ui所遇BUG与需求集结(二)
查看>>
弹性公网EIP,让网络更自由、灵活
查看>>
一对一直播源码都实现了哪几种常见的优化技术? ...
查看>>
Unity学习系列一简介
查看>>
利用Python框架pyxxnet_project实现的网络服务
查看>>
一个最简单的WebSocket hello world demo
查看>>
C# 8.0的三个令人兴奋的新特性
查看>>
关于ip_conntrack跟踪连接满导致网络丢包问题的分析
查看>>
烂泥:linux学习之VNC远程控制(一)
查看>>
如何解决Xshell使用时中文字体是躺倒显示的问题
查看>>
Scala函数的定义的几种写法
查看>>