用了很久的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)---总体架构的更多相关文章

  1. 大数据学习--day16(集合总体架构--ArrayList--LinkedList)

    集合总体架构--ArrayList--LinkedList Collection接口的实现类用法上都有相似的方法.Map同理. List: 特性 :      1. 有索引     2. 有序     ...

  2. 2019-1-24 Spark 学习 --总体架构

    2019-1-24 Spark 学习 --总体架构 新建 模板 小书匠 1548339392539.jpg 1548339357270.jpg 1548339372461.jpg 1548339345 ...

  3. python源码学习(一)——python的总体架构

    python源码学习(一)——python的总体架构 学习环境: 系统:ubuntu 12.04 STLpython版本:2.7既然要学习python的源码,首先我们要在电脑上安装python并且下载 ...

  4. [源码解析] 深度学习分布式训练框架 horovod (12) --- 弹性训练总体架构

    [源码解析] 深度学习分布式训练框架 horovod (12) --- 弹性训练总体架构 目录 [源码解析] 深度学习分布式训练框架 horovod (12) --- 弹性训练总体架构 0x00 摘要 ...

  5. Framebuffer 驱动学习总结(一) ---- 总体架构及关键结构体

    一.Framebuffer 设备驱动总体架构 帧缓冲设备为标准的字符型设备,在Linux中主设备号29,定义在/include/linux/major.h中的FB_MAJOR,次设备号定义帧缓冲的个数 ...

  6. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  7. jQuery总体架构

    第一章  总体架构 1.设计理念 jQuery的理念就是“写更少的代码,做更多的事”,而且做到代码的高度兼容性. 2.总体架构 大致可以分为三个部分:构造模块,底层支持模块和功能模块. 3.使用自调用 ...

  8. Alink漫谈(十四) :多层感知机 之 总体架构

    Alink漫谈(十四) :多层感知机 之 总体架构 目录 Alink漫谈(十四) :多层感知机 之 总体架构 0x00 摘要 0x01 背景概念 1.1 前馈神经网络 1.2 反向传播 1.3 代价函 ...

  9. [源码解析] 机器学习参数服务器 Paracel (1)-----总体架构

    [源码解析] 机器学习参数服务器 Paracel (1)-----总体架构 目录 [源码解析] 机器学习参数服务器 Paracel (1)-----总体架构 0x00 摘要 0x01使用 1.1 配置 ...

随机推荐

  1. Zeratul的完美区间(线段树||RMQ模板题)

    原题大意:原题链接 给定元素无重复数组,查询给定区间内元素是否连续 解体思路:由于无重复元素,所以如果区间内元素连续,则该区间内的最大值和最小值之差应该等于区间长度(r-l) 解法一:线段树(模板题) ...

  2. IOS-APP主流UI框架结构

    一.简单示例 说明:使用APP主流UI框架结构完成简单的界面搭建 搭建页面效果:                                二.搭建过程和注意点 1.新建一个项目,把原有的控制器删 ...

  3. day37 爬虫2(web微信、高性能相关、Scrapy)

    s16day37 爬虫2 参考博客:http://www.cnblogs.com/wupeiqi/articles/6229292.html 课堂代码:https://github.com/liyon ...

  4. Ansible 小手册系列 十九(常见指令表)

    Play 指令 说明 accelerate 开启加速模式 accelerate_ipv6 是否开启ipv6 accelerate_port 加速模式的端口 always_run   any_error ...

  5. nginx默认配置

    user nobody; worker_processes 2; worker_cpu_affinity 000000001000 000000010000; worker_rlimit_nofile ...

  6. 025——VUE中事件的基本使用与VUE中差异

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. QT中Qtableview视图表格中点击表头进行排序

    用QT写了一个小工具,主要是对Excel中大量的数据进行计算和显示. 写了有一段时间,然后断断续续的做一些修改和完善. 因为要显示的数据有多列,很自然的会想到要能够对显示的数据进行排序.如果直接操作m ...

  8. C++STL内存配置的设计思想与关键源码分析

    说明:我认为要读懂STL中allocator部分的源码,并汲取它的思想,至少以下几点知识你要了解:operator new和operator delete.handler函数以及一点模板知识.否则,下 ...

  9. -Linux下的虚拟机安装与管理

    一.虚拟机安装 首先安转之前,要提前下载一个镜像,这里是:rhel-server-7.0-x86_64-dvd.iso 1)图形化方法 [1]在本机打开终端,切换到超级用户下.输入命令:virt-ma ...

  10. Data truncated for column

    数据类型不合法造成的.检查插入的数据.