基于MEF的插件框架之总体设计

1.MEF框架简介

MEF的全称是Managed Extensibility Framework(MEF),其是.net4.0的组成部分,在3.5上也可以使用。熟悉java中的spring框架的人,对这个框架中涉及的几个概念应该会比较容易理解。

这里我先把我两年多前的一个完整的利用MEF搭建的插件式系统中涉及到的MEF框架里的几个基本概念大致描述下。

1.1 依赖注入(export、import)

MEF框架中提供 import和export功能,即注入和导出。Spring中有依赖注入这个概念,这里的这个概念也是大同小异,即将某个对象实例化后,注入到依赖这个实例的对象中,如此可以降低类之间的耦合。同样,与spring中的注入类似,MEF也有延迟注入这个概念,普通的依赖注入在整个程序开始运行时便进行了注入,而这种延迟注入可以做到只有当对象需要被使用时才进行注入。

1.2约定(Contracts)

约定是与依赖注入相辅相成的。依赖注入最大的好处就是类与类之间解耦,但是如何知道到底是将一个类注入到另外一个类中呢,这里就需要约定这个概念了。既需要注入的类并不用直接引用对方的类,而是两者通过一个共同的接口(也可以是类等其他),此接口即为约定,从而进行导出和注入。

1.3 目录和组件容器(catalog、compositionContainer)

我们用spring时,针对不同的应用,我们只需要启动applicationContext或者WebApplicationContext将配置加载到IOC容器中,根据XML配置或者注记便可以实现类的依赖注入。在MEF框架中,这种IOC容器需要代码来进行实现,并且配置一般通过注记的方式。

这里涉及到两个概念,分别是catalog和compositionContainer。catalog中将所有需要组装到IOC容器中的类集中到一起,然后再将catalog放入到componentContainer中,这样我们的IOC容器便拥有了所有的需要进行控制的类。但是仅仅放入后,也并不能让容器进行自动的依赖注入,它还需要我们进行ComposeExportedValue和SatisfyImportsOnce这样的操作,才能真正的完成依赖注入的全过程。

1.4 MEF框架图

2.系统设计

我这里先把两年前的那个项目的内容大致描述下。该项目为一个影像处理全自动化的项目,分为影像的自动化接收,利用Platform进行并行化预处理,然后再利用此平台对影像进行冰凌、干旱、洪涝的分析处理,最后生成产品后发布和入库。当时是由几个大学和一个单位一起合作完成的,哪几个大学就不说了。我只是这些众多参与人中的一个,不过我不是像他们做遥感用envi的DLL语言处理影像的,也不是他们用Platform做并行计算的,也不是那些后台做产品发布和入库的。我做的主要是下面这个需求。

2.1需求

(1)将每天接受的原始影像展现在前台,尽量以合理的美观的方式展现。

(2)提供影像的查询功能,包括时间空间等查询。

(3)提供影像的下载功能。

(4)提供日志的查询功能。

(5)提供对服务器的监听功能。

(6)将手动处理完的成果进行管理和展示。

(7)提供对手动处理完的数据进行元数据注册。

(8)能将自动化中的各个模块提炼成手动也能辅助进行的模块,并且可以集成到系统中。

2.2需求分析

看了需求后,我第一个感觉就是这个系统得做出插件式系统,最后我选定了MEF。既然决定了要做插件式系统,那么就得把需求分一个类,及哪些是宿主程序本身有的,哪些是该做成插件。显而易见,需求中的(1)到(6)都可以做在宿主程序中。而(7)和(8)的话,都是单独的插件模块,因为这(7)和(8)的功能都是提取自自动化流程中的,由各个不同的人员完成,我这里只需要提供他们统一的接口以及需要的调用方式就可以由他们自身做成插件了。而且以后可能会将更多的自动化流程提取出来,都做成插件后,方便扩展。

2.3 技术分析

这里主要讲针对插件系统的技术需求。

(1)能够将插件插入到相应的地方,比如是工具栏呢还是左侧选择栏等。

(2)点击插件所在的按钮后,插件能弹出。这里需要的是单例模式。

(3)插件能和宿主通讯,比如插件完成了某项功能,需要通知宿主该功能已经完成。

(4)插件和插件之间也要能通讯,比如一个插件完成了某个功能后,能将得出的参数显示在另外一个插件上。

3.插件框架的设计图

下一节,插件框架的通信机制的实现中,我会首先讲下这个框架实现中的核心部分。在下下讲中我们再讲整个框架的依赖注入和界面实现。

 

基于MEF的插件框架之总体设计的更多相关文章

  1. (2)从实际项目谈起,基于MEF的插件框架之总体设计

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.MEF框架简介 MEF的全称是Managed Extensibil ...

  2. 基于Proxy思想的Android插件框架

    意义 研究插件框架的意义在于下面几点: 减小安装包的体积,通过网络选择性地进行插件下发 模块化升级.减小网络流量 静默升级,用户无感知情况下进行升级 解决低版本号机型方法数超限导致无法安装的问题 代码 ...

  3. [连载]《C#通讯(串口和网络)框架的设计与实现》-2.框架的总体设计

    目       录 C#通讯(串口和网络)框架的设计与实现... 1 (SuperIO)- 框架的总体设计... 1 第二章           框架总体的设计... 2 2.1           ...

  4. .Net中的插件框架Managed Extensibility Framework

    Managed Extensibility Framework(MEF)是微软的一个用来扩展.NET应用程序的框架,它最初为了满足Visual Studio里的编辑器的需求,比如说,延迟加载所有东西和 ...

  5. 分享在Linux下使用OSGi.NET插件框架快速实现一个分布式服务集群的方法

    在这篇文章我分享了如何使用分层与模块化的方法来设计一个分布式服务集群.这个分布式服务集群是基于DynamicProxy.WCF和OSGi.NET插件框架实现的.我将从设计思路.目标和实现三方面来描述. ...

  6. 8个强大的基于Bootstrap的CSS框架

    做过前端开发的小伙伴们应该对Bootstrap不会陌生,它是由Twitter推出的开源CSS框架,其中包含了很多Web前端开发的工具包和应用组件.当然,和jQuery一样,Bootstrap同时也是一 ...

  7. 在VC6中基于dll开发插件用于各种图片显示(BMP/TGA/JPG/GIF/PNG/TIF/ICO/WMF/EMF/...)

    一.图片显示 图片显示的方法: 1.  直接写程序 2.  第3方库 3.  调用COM组件的IPicture接口 4.  使用MFC的CPictureHolder类 5.  使用GDI+的CImag ...

  8. [转]C/C++:构建你自己的插件框架

    本文译自Gigi Sayfan在DDJ上的专栏文章.Gigi Sayfan是北加州的一个程序员,email:gigi@gmail.com. 本文是一系列讨论架构.开发和部署C/C++跨平台插件框架的文 ...

  9. 在ASP.NET MVC应用中开发插件框架(中英对照)

    [原文] Developing a plugin framework in ASP.NET MVC with medium trust [译文] 在ASP.NET MVC应用中开发一个插件框架 I’v ...

随机推荐

  1. 基于hadoop的电影推荐结果可视化

    数据可视化 1.数据的分析与统计 使用sql语句进行查询,获取所有数据的概述,包括电影数.电影类别数.人数.职业种类.点评数等. 2.构建数据可视化框架 这里使用了前端框架Bootstrap进行前端的 ...

  2. jQuery.reveal弹出层

    jQuery.reveal弹出层使用 最近用到弹出层,还得自定义UI,原本用的artDialog太庞大,不合适了,于是就找到了这个东西,又小又好用,基础的弹出遮罩都有了,想要什么还不是Coder自己说 ...

  3. org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: sys.entity.Role; nested exception is org.hibernate.PersistentObjectException: 的解决方案

    1.错误信息 org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist ...

  4. XSS学习笔记(五)-XSS防御

    如果只生产XSS的地方都与输入或输出相关联的.所以错过了主要矛盾.而且,我们将有一个解决问题的办法:您可以输入端砚格过滤,是可能的过滤输出时间,输出到用户的GET或POST中是否有敏感字符: 输入过滤 ...

  5. django中通过model名字获取model

    django1.6, 通过字符串和get_app.get_model获得对应的object 只需要两行代码: from django.db.models import get_model get_mo ...

  6. hdu 3874

    求一个序列中全部数字的和,当中数值同样的仅仅能计算一次. 先储存全部的请求,然后依照它们的右边界排序,在查询的同一时候更新区间.这里事实上有一点点DP的味道,在它进行某个查询之前,保证全部的反复数字( ...

  7. Linux常用命令2--用户问题、文件的打包压缩

    Linux常用命令 如何进行用户和群组的创建和更改 [1]groupadd:用于创建新的群组. 语法:groupadd [-option] 用户名:其常用参数有:-g groupadd -g 555 ...

  8. 泛型方法动态生成表达式树 Expression

    public string GetGridJSON(TraderInfo model) { IQueryable<TraderInfo> Temp = db.TraderInfo; if ...

  9. Vs2012 构建配置 Lua5.2.3

    随着手机游戏client程序员,当然,遇到这样的问题,该游戏已经提交出版.但第二天一早,发现有一个逻辑游戏BUG.怎么办,不严重,在一般情况下,非强制性的更新.假设一个严重BUG,他们将不得不强制更新 ...

  10. 利用WebBrowser实现Web打印的分析

    原文:利用WebBrowser实现Web打印的分析 WebBrowser是IE内置的浏览器控件,无需用户下载.本文档所讨论的是有关IE6.0版本的WebBrowser控件技术内容.其他版本的IE应该也 ...