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

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。

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.插件框架的设计图

 

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

                                                -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

                                                          如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Object-C 类,对象,运行时,isa

今天记录一下它的底层运作。 1: 类Class: typedef struct objc_class * Class; 从Class的定义可以看出,它是一个 objc_class 结构类型的指针,objc_class又是什么呢? struct objc_class{struct objc…

Avalonia跨平台入门第四篇之Popup在uos下问题

上一篇简单玩耍了Popup,这不正当我洋洋自得的时候前线传来战报:你家伙做的效果在UOS下面有问题;然后直接发来一张捷报:明明在乌班图和优麒麟都没啥问题,单单就你这个UOS牛,结果发现个神奇的特效:开启神奇的特效,果然神奇:来看看最终实现的效果:最终简单的效果先这样吧;以后有时…

C++之用std::nothrow分配内存失败不抛异常

1、std::nothrow介绍 1).malloc分配时,如果内存耗尽分配不出来,会直接返回NULL; 2.)早期C版本,new分配时,如果内存耗尽分配不出来,也会直接返回NULL; 我们可以使用关键…

linux 安装apache http server

参考http://blog.csdn.net/sundenskyqq/article/details/24733923 但这篇博文有些东西有错。 参考http://www.cnblogs.com/zhuque/archive/2012/11/03/2763352.html 部分内容 步骤: 1、 下载apr、apr-util、pcre、Apache httpserver 地址如下: apr/ apr…

理科都要学大学计算机吗,女生不适合学理科专业?报考这些理科专业,一毕业就会遭到疯抢!...

男学理,女学文,似乎一直以来都是考生们报考专业时所“遵循”的一个主流,因为无论是专业学习知识理论的侧重点,还是未来就业的偏向性,文理科专业都呈现出非常大的差异。女生们或许更适合文科类专业的学习和就业&#xf…

8个使用JavaScript展示图片解决方案

1. JonDesign’s SmoothGallery 2.0 SmoothGallery demo 2. (E)2 Photo Gallery (E)2 Photo Gallery demo 3. jQuery Gallery 4. MooPix 5. Highslide JS Highslide JS demo 6. Flickrshow 7. Galleria Galleria demo 1 - Galleria demo 2 8. LightWindow v2.0

Linux中常用的操作指令(随时更新)

注:本文的所有内容都来源于网络,是本人再使用过程中遇到的一些不太常用、经常忘记的指令,出处太分散,无法标注。如有问题,请在下方留言,本人会及时更正或删除。谢谢! CentOS 防火墙放开端口 #su…

Android之程序反复回调一个类的解决办法

1、问题 看了别人的代码,然后修改了下代码,程序总是死循环调用这个类,但是日志又好像有限,分析不出来,不知道是哪个地方有检测机制,导致这个类不断的创建,看了一上午不知所措。 2、解决办法 找…

Avalonia跨平台入门第三篇之Popup

前面已经分享了二篇关于Avalonia入门的文章,今天接着去摸索关于Popup的知识点;你还别说一上来就遇到坑了(后台定义的Popup直接黑框):然而在WPF中没有出现这个Bug:最后只能默默的再前台进行定义了:来看看最终实现的效果:后台打开无非就是Open方法就行,最后先来预告下一篇的效果滑…

SGU 160.Magic Multiplying Machine

时间限制:0.5s 空间限制6M 题意&#xff1a; 给出n个&#xff08;1<n<10000&#xff09;1~m&#xff08;2<m<1000&#xff09;范围内的数&#xff0c;选择其中任意个数&#xff0c;使它们的 乘积 模m 最大&#xff0c;输出最大的分数&#xff0c;和选择的数的编号。…

Swift和Objective-C混编

Swift中调用Objective-C文件 1.新建Swift文件SwiftViewController.swift 2.因为工程为OC编写,第一次创建会提示需要创建"桥接文件" 3.此时的工程会有SwiftViewController.swift文件和HelloWorld-Bridging-Header.h桥接文件 4.检查桥接文件HelloWorld-Bridging-Header…

计算机网络病毒解读,【数据挖掘论文】计算机网络病毒防御数据挖掘技术应用(共3503字)...

摘要&#xff1a;网络病毒对网络系统的攻击会造成危害性&#xff0c;并对计算机的网络安全造成影响&#xff0c;使重要文件中毒&#xff0c;导致重要数据丢失。本文将结合数据挖掘技术的相关模式进行探讨&#xff0c;浅析数据挖掘技术对计算机网络病毒防御的实际应用。关键词&a…

Java的LockSupport.park()实现分析

LockSupport类是Java6(JSR166-JUC)引入的一个类&#xff0c;提供了基本的线程同步原语。LockSupport实际上是调用了Unsafe类里的函数&#xff0c;归结到Unsafe里&#xff0c;只有两个函数&#xff1a; park&#xff1a;阻塞当前线程(Block current thread),字面理解park&#x…

Android之用adb screencap -p命令截图

1、截图保存到sdcard adb shell /system/bin/screencap -p /sdcard/screenshot.png 2、pull拉取到本地 adb pull /sdcard/screenshot.png

Avalonia跨平台入门第二篇

前面一篇简单的弄了个Demo去玩耍了一下Avalonia;你还别说效还挺有意思,这不咱们今天接着更深一步的去了解他,来看看效果:在统信UOS下运行效果:环境搭建在统信UOS(多一步开启开发模式):使用开源的PanAndZoom控件&#xff1a;继承Canvas自定义控件,进行网格绘制&#xff1a;最终简…

耶鲁大学计算机科学录取,2020年耶鲁大学排名TFE Times美国最佳计算机科学硕士专业排名第18...

耶鲁大学实力介绍耶鲁大学(Yale University)&#xff0c;简称“耶鲁(Yale)”&#xff0c;是一所坐落于美国康涅狄格州纽黑文的世界著名私立研究型大学&#xff0c;是八所常春藤盟校中最重视本科教育的大学之一。耶鲁大学有3,200名教职工&#xff0c;每年招收约1,250名学生&…

[九]RabbitMQ-客户端源码之Consumer

在[八]RabbitMQ-客户端源码之ChannelN中讲述basicConsume的方法时设计到Consumer这个回调函数&#xff0c;Consumer其实是一个接口&#xff0c;真正实现它的是QueueingConsumer和DefaultConsumer&#xff0c;且DefaultConsumer是QueueingConsumer的父类&#xff0c;里面都是空方…

Performance Metrics(性能指标1)

Performance Metrics(性能指标) 在我们开始旅行本书之前&#xff0c;我必须先了解本书的性能指标和希望优化后的结果&#xff0c;在第二章中&#xff0c;我们探索更多的性能检测工具和性能指标&#xff0c;可是&#xff0c;您得会使用这些工具和明白这些性能指标的意义。 由于业…

ExtJs 4.x Ajax简单封装

/*** Ajax 请求*/ Ext.define("SinoCloudAjaxRequestClass", {constructor : function () {var me this;var viewport me.getViewPort();if(viewport){window.sinoCloudAjaxRequestClassLoadingMak new Ext.LoadMask(viewport, {msg:"处理中..."});}},r…

可能是.NET领域性能最好的对象映射框架——Mapster

我之前文章提到过 MediatR 的作者 Jimmy Bogard&#xff0c;他也是大名鼎鼎的对象映射框架 AutoMapper 的作者。AutoMapper 的功能强大&#xff0c;在 .NET 领域的开发者中有非常高的知名度和使用率。而今天老衣要提的是另外一款高性能对象映射框架&#xff1a;Mapster——它轻…