用了很久的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. 普通for循环遍历LinkedList弊端

    java开发过程中,用到的最多的List集合就属ArrayList与LinkedList.对于ArrayList的遍历,通常是下面的方法: public static void main(String ...

  2. SPOJ MYQ10 (数位DP)

    题意 询问区间[a,b]中的Mirror Number的个数,其中Mirror Number是指把它横着翻转后还能表示同样的数字. 思路 注意这个可不是回文数..除了0,1,8,别的数字翻转过后就不是 ...

  3. nginx模块记录

    1. ngx_http_ssl_module 让Nginx可以支持HTTPS的模块 (1)ssl on | off; #是否开启ssl功能 (2)ssl_certificate file; #当前虚拟 ...

  4. linkbutton组件

    可独立存在的组件. inkbutton 按钮组件 通过$.fn.linkbutton.defaults重写默认的defaults链接按钮(linkbutton)用于创建一个超链接按钮.它是一个正常的& ...

  5. asp下去除数组中重复的项的方法

    <%Function MoveR(Rstr) Dim i,SpStr SpStr = Split(Rstr,",") For i = 0 To Ubound(Spstr) I ...

  6. (转)Mac os x 下配置Intellij IDEA + Tomcat 出现权限问题的解决办法

    出现的错误提示如下: 下午9:11:27 All files are up-to-date下午9:11:27 All files are up-to-date下午9:11:27 Error runni ...

  7. LeetCode之Longest Substring Without Repeating Characters

    [题目描述] Given a string, find the length of the longest substring without repeating characters. Exampl ...

  8. DRF中五大扩展类及视图集的介绍

    五个扩展类 (1)ListModelMixin 列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码. 该Mixin的list方法会对 ...

  9. Python面向对象的三大特征 --- 封装、继承、多态

    一.封装 1)封装:是面向对象的一大特点:将属性和方法封装在一个抽象类中.外界使用类创建对象,然后让对象调用内部方法.对象方法的细节都被封装在类的内部. class Person():   def _ ...

  10. Axure RP 7.0 注册码

    2016.01.25安装可用   Axure RP 7.0 注册码  用户名:axureuser  序列号:8wFfIX7a8hHq6yAy6T8zCz5R0NBKeVxo9IKu+kgKh79FL6 ...