.NET简谈插件系统开发模式
摘选自[王清培]博客
http://www.cnblogs.com/wangiqngpei557/archive/2011/06/10/2077413.html
今天跟大家分享一下我们在日常开发中并不常用的开发模式“插件系统模式”,什么叫插件,从大一点的概念讲就是我们开发的软件是由很小的模块组成,每一块都能成功的装卸,使我们的软件成为一个有机体,在发生重大事故、改良优化等等的时候,我们不需要重新编译我们的系统就能很方便的进行升级替换进行使用;这样的开发模式就是插件系统开发模式;这个概念很大,每个人的技术水平不同使用的效果也是不同的;一个大型的系统,不能简简单单的用三层或者MVC来概括,我们要站在一个更高的角度去思考程序,每当我们开始一个新系统的架构设计时,我们不能总是保守的使用以往的思想模式,我们是否深思熟虑过这些开发模式在我们当前系统中是否可用或者说是否能发挥模式的最大效果。
插件系统在很早之前就出现了,包括我们的VisualStudio开发工具的原型都是用的这种模式,我上面也说了每个人的技术水品不同使用的效果也是不同的,我跟大家分享一下我对插件模式的理解和在项目中的使用经验;我将插件系统大体抽象成下图结构:

上图很清晰的描述了我们插件系统的整体执行步骤,我们将应用程序的整个生命周期进行抽象(抽象是我们程序员必备思想,要随时具备抽象化准备),不管什么应用程序都有前后执行顺序,我只是用Main表示一下,在开始执行前我们需要读取插件所在的路径然后进行插件对象的全路径保存,以便在后面运行时方便加载;到了Run开始真正的执行我们的应用程序了,我们需要根据插件的类型进行加载,插件必须具备类型的原则,用在什么地方的,好比汽车的零部件,我们有明确的规定,这里的实现我们可以用接口进行标识;当程序开始结束的时候,我们需要释放各个插件所占用的系统资源,为什么我们要手动释放这些资源呢,有的朋友会说不是用CLR的GC吗?GC只能释放托管资源,非托管资源它管不到,在我们进行P/Invoke平台调用时候,资源释放是比较复杂的,由于托管和非托管的内存分配是不同的,至于怎么释放非托管资源我这里穿插一下我比较喜欢的方法吧,当我们用非托管C++编写核心且高效的系统功能时,往往它占用的资源是非常可观的,所以当我们调用完毕后在第一时间释放是必须的,我们可以进行托管封装,在非托管内部我们定义释放资源的方法,然后在通过P/Invoke调用释放资源的非托管方式进行释放;由于这里牵扯到.NET互操作方面的知识了,这这篇文章中我们就涉及了;
来看代码怎么实现:

在我的解决方案中,Plug是插件有关的对象;在PlugInterface里面是所有插件接口,在LoadInterface文件里面是所有加载过程中的插件,我们需要明确插件的类型,只有这样才能很好的控制插件;软件的生命周期随着需求不同而不同,这里是需要我们去收集和提取的,在应用程序的整个生命周期中我们都可以无缝的装卸插件,那是多么美妙的事情;

这是本人在公司的一个项目中的实现代码,由于代码属于公司所有,所以不便于公开;其实代码没什么技术含量就看怎么用了;OK,差不多讲完了;
[王清培版权所有,转载请给出署名]
.NET简谈插件系统开发模式的更多相关文章
- .NET简谈构件系统开发模式
转自[王清培] http://www.cnblogs.com/wangiqngpei557/archive/2011/06/14/2080416.html 在本人的“.NET简谈插件系统开发模式”一文 ...
- 浅谈Android系统开发中LOG的使用
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6581828 在程序开发过程中,LOG是广泛使用 ...
- 浅谈Android系统开发中LOG的使用【转】
本文转载自:http://blog.csdn.net/luoshengyang/article/details/6581828 在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以 ...
- ctkPlugin插件系统实现项目插件式开发
插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有 ...
- 人人公益模式系统开发app
人人公益模式系统开发app(微or电 158.1500.1390 小凡团队)人人公益系统开发,人人公益系统模式定制,人人公益系统开发模式,人人公益平台开发系统,人人公益APP系统开发. 深圳人人优益网 ...
- 果园种植系统开发App,游戏+商业模式?
果园种植全返系统开发,英伦果园开发,微信果园种植系统开发,百果生态乐园开发,淘金农夫开发,农场果园种植游戏系统,果园种植APP系统开发,果园种植软件开发找陈牧150-1315-1740(微/电)开发者 ...
- 一点公益二码公益开发模式系统源码App
写这篇文章,是因为最近看到的一个著名的开源项目在内部使用时的各种问题,不得不说,很多的开源的东西思想是不错的,但离真正工程化都有不小的距离,所以没什么商业公司采用的开源产品如果要引入的话一定要慎重,通 ...
- 二十八、带给我们一种新的编码思路——EFW框架CS系统开发中的MVC模式探讨
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...
- 皮皮果模式系统开发app
皮皮果系统定制开发,皮皮果网站系统开发. 皮皮果游戏横空出世,比QQ农场有过之而无不及,深得广大玩家喜爱.无论草根百姓还是达官贵人,都可以来学习娱乐的游戏.让你在娱乐中收获物质生活和精神生活,英伦果园 ...
随机推荐
- Validform:一行代码搞定整站的表单验证!
表单验证不再发愁,http://validform.rjboy.cn/
- C++ Primer : 第十二章 : 动态内存之动态内存管理(new和delete)
C++语言定义了两个运算符来分配和释放动态内存:运算符new分配内存,运算符delete释放new分配的内存. 运算符new和delete 使用new动态分配和初始化对象 在自由空间分配的内存是无名的 ...
- 解决dede搜索页面只能显示10条信息解决方案
解决dede搜索页面只能显示10条信息解决方案,感觉显示的信息太少,这时就要想办法去解决一下.看看有什么好办法来解决一下这个问题. dede搜索页模板中,默认只能显示10条记录. 打开dede搜索页模 ...
- PHP的一些要点
1.用户评论的内容应当使用htmlspecialchars()函数进行过滤,如htmlspecialchars($_POST['content']);再写入数据库,防止用户评论中含有JS和HTML代码 ...
- Python-事件驱动模型代码
#/usr/env/bin python ''' this is document ''' class Event(object): ''' 事件初始化的一个方式 ''' def __init__(s ...
- Java文件读写操作指定编码方式。。。。。
读: File file=new File(this.filePath);BufferedReader br=new BufferedReader(new InputStreamReader(new ...
- page cache 与 page buffer 转
page cache 与 page buffer 标签: cachebuffer磁盘treelinux脚本 2012-05-07 20:47 2905人阅读 评论(0) 收藏 举报 分类: 内核编程 ...
- 自然语言处理1——语言处理与Python(内含纠错)
学习Python自然语言处理,记录一下学习笔记. 运用Python进行自然语言处理需要用到nltk库,关于nltk库的安装,我使用的pip方式. pip nltk 或者下载whl文件进行安装.(推荐p ...
- Entity Framework 6新特性:全局性地自定义Code First约定
2012年12月11日,Entity Framework已经发布了Entity Framework 6 Alpha2,因项目需要,目前已使用了其中的两个特性,今天就来介绍一下第一个特性:全局性地自定义 ...
- http://stackoverflow.com/questions/12601907/loading-google-maps-in-anonymous-function
http://stackoverflow.com/questions/12601907/loading-google-maps-in-anonymous-function window.gMaps ...