基于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 ...
随机推荐
- ash
查看当前用户使用的Shell,echo $SHELL BusyBox ('01-current) The BusyBox distribution is aiming for small implem ...
- hdu4699 Editor 2013 多校训练第十场 D题 数列维护 splay | 线段树 | 栈!!!!!
题意:维护一个文本编辑,并且查询最大前缀和. 写了splay,wa了13次 过了之后觉着特傻逼.发现题解两个栈就可以了,光标前后维护两个栈,维护前面的栈的前缀和 和 最大前缀和. 哎,傻逼,太弱了,还 ...
- thinkphp 删除该表的最后一行
问题叙述性说明: 文章连接动态连接表格,因为有被添加.有必须删除.动态添加到表格这似乎有点不合理.它应该只被添加到表格行.而不是增加一个新表格. 发布完整的代码在这里,加入表格新行和删除表格最后一行. ...
- 开发并调试 Mail Add-in
开发并调试 Mail Add-in (mail app for Outlook) 准备工作 如果你的邮箱搭建在 Exchange Server 上,则可以创建邮件应用程序(Mail Add-in)来扩 ...
- [Mac] Mac book pro互换SSD硬盘、生产启动U菜、TimeMachine恢复 小记
Mac book pro 硬盘故障.互换SSD硬盘.启动U磁盘生产 小记 2012新年买Mbp了.尽管各种功能都能用,但常常频繁的出现鼠标风火轮,已经下好的电影在本地播放时都会隔个几分钟卡一下. 拿到 ...
- 20天android学习
20多天的实习(事实上,一个人学习的东西)要结束, 其余的都只有读研. 此20许多天,我学到了很多东西, 至android的发展也有一定的了解.之后写这篇文章主要是完成研究可以学得很快再次回升 1.安 ...
- 大数据系列修炼-Scala课程03
前言 今天上班看了很多关于前端js,jQuery.bootstrap.js以及springMVC看得迷迷糊糊的,毕竟以前很少去学习前端的技术,所有看得有点困,还好看得比较多,回家后也开始学习关于Sca ...
- 【spring教程之二】spring注射剂xml构造方法参数
1.上述续,假设你想注入bean当文件,传递给构造函数的参数.主要的变化是需要spring.xml配置文件来配置. <?xml version="1.0" encoding= ...
- Office——检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败
检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 8000401a 1.运行dcomcnfg.e ...
- html转换为纯文本,支持撇号
/// <summary> /// html转换为纯文本 /// </summary> /// <param name="source">< ...