基于MEF的插件框架之总体设计
基于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的插件框架之总体设计的更多相关文章
- (2)从实际项目谈起,基于MEF的插件框架之总体设计
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.MEF框架简介 MEF的全称是Managed Extensibil ...
- 基于Proxy思想的Android插件框架
意义 研究插件框架的意义在于下面几点: 减小安装包的体积,通过网络选择性地进行插件下发 模块化升级.减小网络流量 静默升级,用户无感知情况下进行升级 解决低版本号机型方法数超限导致无法安装的问题 代码 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》-2.框架的总体设计
目 录 C#通讯(串口和网络)框架的设计与实现... 1 (SuperIO)- 框架的总体设计... 1 第二章 框架总体的设计... 2 2.1 ...
- .Net中的插件框架Managed Extensibility Framework
Managed Extensibility Framework(MEF)是微软的一个用来扩展.NET应用程序的框架,它最初为了满足Visual Studio里的编辑器的需求,比如说,延迟加载所有东西和 ...
- 分享在Linux下使用OSGi.NET插件框架快速实现一个分布式服务集群的方法
在这篇文章我分享了如何使用分层与模块化的方法来设计一个分布式服务集群.这个分布式服务集群是基于DynamicProxy.WCF和OSGi.NET插件框架实现的.我将从设计思路.目标和实现三方面来描述. ...
- 8个强大的基于Bootstrap的CSS框架
做过前端开发的小伙伴们应该对Bootstrap不会陌生,它是由Twitter推出的开源CSS框架,其中包含了很多Web前端开发的工具包和应用组件.当然,和jQuery一样,Bootstrap同时也是一 ...
- 在VC6中基于dll开发插件用于各种图片显示(BMP/TGA/JPG/GIF/PNG/TIF/ICO/WMF/EMF/...)
一.图片显示 图片显示的方法: 1. 直接写程序 2. 第3方库 3. 调用COM组件的IPicture接口 4. 使用MFC的CPictureHolder类 5. 使用GDI+的CImag ...
- [转]C/C++:构建你自己的插件框架
本文译自Gigi Sayfan在DDJ上的专栏文章.Gigi Sayfan是北加州的一个程序员,email:gigi@gmail.com. 本文是一系列讨论架构.开发和部署C/C++跨平台插件框架的文 ...
- 在ASP.NET MVC应用中开发插件框架(中英对照)
[原文] Developing a plugin framework in ASP.NET MVC with medium trust [译文] 在ASP.NET MVC应用中开发一个插件框架 I’v ...
随机推荐
- 记录我第一次在Android开发图像处理算法的经历
大概是四月底的时候.有人加我QQ问我是否做能做一些基于图像皮肤检測的算法, 主要是实现对皮肤六项指标: 1. 水分 2. 有份 3. 痤疮与痘痘 4. 色斑与肤 ...
- android学习记录(三)百度地图错误---只有一个电话显示帧,没有地图内容。
安卓开发新手百度地图,刚开始碰到一个问题,没有地图信息,还有就是它只有一帧. 如图所示: 上网寻找说是key的问题,然后又一次申请.还是不行. 最后再次看了自己的Manifest文件,发现自己的< ...
- Xcode HeaderDoc 过程(1)
原版的: http://www.raywenderlich.com/66395/documenting-in-xcode-with-headerdoc-tutorial 了解如何从代码中生成文档! X ...
- 【LeetCode】 String中的最长回文
java 普通版: 1.正序遍历数组,取得子字符串的首字母. 2.倒序遍历数组,取的子字符串的尾字母. (这样仅仅要在子循环中第一个出现回文,那么该回文肯定是本次循环的最长的回文) 3.新增数据结构, ...
- Flex自定义组件开发之日周月日期选择日历控件
原文:Flex自定义组件开发之日周月日期选择日历控件 使用过DateField的我们都知道,DateField 控件是用于显示日期的文本字段,字段右侧带有日历图标.当用户在控件边框内的 ...
- C#关于图片的相关处理
public class ImageHelper { /// <summary> /// 图片转换成字节流 /// </summary> /// <param name= ...
- flex builder 4.7 ios 该溶液无法找到设备
行政建议,没有设备 1) 视图itunes 该服务正在启动(Bonjour服务).测试..... .即使没有这样的假设 2)"D:\Program Files\Adobe\Adobe Fla ...
- MVC 缓存1
MVC 缓存 为什么要讲缓存.缓存到底有什么作用? 下面我们来说一个场景我们有一个首页菜单的布局基本是不会经常发生的变化,如果动态生成的 Web 页被频繁请求并且构建时需要耗用大量的系统资源,那么,如 ...
- centos5.8本地安装yum资源,安装软件包
首先 [root@mode media]# cd /etc/yum.repos.d/ [root@mode yum.repos.d]# ll total 16 -rw-r--r-- 1 root ro ...
- Python编写网页爬虫爬取oj上的代码信息
OJ升级,代码可能会丢失. 所以要事先备份. 一開始傻傻的复制粘贴, 后来实在不能忍, 得益于大潇的启示和聪神的原始代码, 网页爬虫走起! 已经有段时间没看Python, 这次网页爬虫的原始代码是 p ...