MEF学习总结(1)---总体架构
用了很久的MEF框架来做依赖注入,最近想把它的原理和机构总结一下,主要包括如下几个方面:
1. 总体架构
2. .Net Composition Primitive
3. Attribute Model Programing/Life cycle
4. Container/Recomposition
什么是MEF
用官方的话说:Managed Extensibility Framework(MEF)是.NET平台下的一个扩展性管理框架。个人理解为依赖注入。将所有模块依赖的组件,或者能提供的组件通过MEF的方式注册到框架。然后通过框架所提供的API来获取依赖的对象。
整体架构如下图:

上层的Container层提供了一系列上层API,用来将MEF框架Host在Application中,以及触发依赖的注入和管理注册的。其中ExportProvider主要负责根据依赖定义信息去找到对应的实例。
中间的Primitives层将真实世界中的依赖,提供依赖的表达,发现和应用进行了通用的模型定义。
AttributedProgrammingModel是对Primitives层的一个默认上层实现,它通过Import,Export等Attribute来定义Primitives层中所定义的依赖和提供依赖,也提供了对应的Catalog将依赖定义信息转化为Primitives定义的通用模型。
注: 上图中有几个基本概念:
Catalog:上图中AssemblyCatalog,TypesCatalog,DirectoryCatalog都属于Catalog,它负责将依赖定义转化为通用的Primitive模型。
ExportProvider:上图中CompositionContainer,AggregateExportProvider,CatalogExportProvider都属于Export Provider,他负责根据依赖的定义信息去找到匹配的依赖对象实例)
Part: MEF中的对依赖组建的描述和包装,一个ComposablePart就是一个可以注入的依赖的实例包装。
所以MEF的整体工作机制为:
1. 通过Attribute Programming Model定义依赖信息。
2. 通过Container层提供的API将依赖信息注册到MEF容器(CompositionContainer),ComposiblePartsCatalog会发现在第1步中所定义的依赖信息,并将其转化为Primitives层中定义的通用模型。
3. 通过Container层提供的API来注入依赖时,Container层中的Export Provider通过Primitives层定义的获取依赖的接口来填充所依赖的对象。
上面的工作机制可以描述为下图:

因为第一步定义的依赖信息会在第二部中被ComposiblePartsCatalog转化为通用模型,因此MEF本身是可扩展的,只需要自定义一套定义依赖信息的机制,然后自定义ComposiblePartsCatalog即可扩展MEF。这就是架构图中的Custom Programing Model.
Reference:https://github.com/MicrosoftArchive/mef
MEF学习总结(1)---总体架构的更多相关文章
- 大数据学习--day16(集合总体架构--ArrayList--LinkedList)
集合总体架构--ArrayList--LinkedList Collection接口的实现类用法上都有相似的方法.Map同理. List: 特性 : 1. 有索引 2. 有序 ...
- 2019-1-24 Spark 学习 --总体架构
2019-1-24 Spark 学习 --总体架构 新建 模板 小书匠 1548339392539.jpg 1548339357270.jpg 1548339372461.jpg 1548339345 ...
- python源码学习(一)——python的总体架构
python源码学习(一)——python的总体架构 学习环境: 系统:ubuntu 12.04 STLpython版本:2.7既然要学习python的源码,首先我们要在电脑上安装python并且下载 ...
- [源码解析] 深度学习分布式训练框架 horovod (12) --- 弹性训练总体架构
[源码解析] 深度学习分布式训练框架 horovod (12) --- 弹性训练总体架构 目录 [源码解析] 深度学习分布式训练框架 horovod (12) --- 弹性训练总体架构 0x00 摘要 ...
- Framebuffer 驱动学习总结(一) ---- 总体架构及关键结构体
一.Framebuffer 设备驱动总体架构 帧缓冲设备为标准的字符型设备,在Linux中主设备号29,定义在/include/linux/major.h中的FB_MAJOR,次设备号定义帧缓冲的个数 ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- jQuery总体架构
第一章 总体架构 1.设计理念 jQuery的理念就是“写更少的代码,做更多的事”,而且做到代码的高度兼容性. 2.总体架构 大致可以分为三个部分:构造模块,底层支持模块和功能模块. 3.使用自调用 ...
- Alink漫谈(十四) :多层感知机 之 总体架构
Alink漫谈(十四) :多层感知机 之 总体架构 目录 Alink漫谈(十四) :多层感知机 之 总体架构 0x00 摘要 0x01 背景概念 1.1 前馈神经网络 1.2 反向传播 1.3 代价函 ...
- [源码解析] 机器学习参数服务器 Paracel (1)-----总体架构
[源码解析] 机器学习参数服务器 Paracel (1)-----总体架构 目录 [源码解析] 机器学习参数服务器 Paracel (1)-----总体架构 0x00 摘要 0x01使用 1.1 配置 ...
随机推荐
- tensorflow入门(二)
import numpy as np import tensorflow as tf import matplotlib.pyplot as plt #使用numpy生成200个随机点 x_data ...
- nginx模块记录
1. ngx_http_ssl_module 让Nginx可以支持HTTPS的模块 (1)ssl on | off; #是否开启ssl功能 (2)ssl_certificate file; #当前虚拟 ...
- 更改gitlab默认端口
若linux服务器的80和8080端口都已经被使用,则需修改gitlab监听的端口 修改路径文件:vim /etc/gitlab/gitlab.rb 1.修改external_url 'http:// ...
- 辛星笔记——VIM学习篇(推荐阅读)
转载自:辛星和您一起学vim脚本第一节 如本文侵犯了您的版权,请联系windeal12@qq.com 这几天在网上看了辛星的一些vim教程博文,觉得很有收获,也很实用,适合入门,所以转载其中一篇留个网 ...
- 源码编译tmux
(1)clone 源代码仓库: $ git clone https://github.com/tmux/tmux.git (2) 编译之前先安装libevent,去官网下载tar包: http://l ...
- SpringMVC札集(05)——SpringMVC参数回显
自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...
- BASE理论
BASE是Basiclly Available(基本可用),Soft state(软状态),Eventually consistent(最终一致性)三个短语的缩写. BASE是对CAP中一致性和可用性 ...
- boost库之udp广播实例
//UdpLinkServer.h //udp服务 #pragma once #include <boost/asio/ip/tcp.hpp> #include <boost/asi ...
- keras系列︱seq2seq系列相关实现与案例(feedback、peek、attention类型)
之前在看<Semi-supervised Sequence Learning>这篇文章的时候对seq2seq半监督的方式做文本分类的方式产生了一定兴趣,于是开始简单研究了seq2seq.先 ...
- VSS虚拟交换系统
下面介绍一下如何在CISCO交换机上配置VSS,具体配置如下: //在CISCO1 上配置vss域,两台设备都要在同一个域中 Cisco-(confgi)#switch virtual domain ...