摘选自[王清培]博客

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简谈插件系统开发模式的更多相关文章

  1. .NET简谈构件系统开发模式

    转自[王清培] http://www.cnblogs.com/wangiqngpei557/archive/2011/06/14/2080416.html 在本人的“.NET简谈插件系统开发模式”一文 ...

  2. 浅谈Android系统开发中LOG的使用

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6581828 在程序开发过程中,LOG是广泛使用 ...

  3. 浅谈Android系统开发中LOG的使用【转】

    本文转载自:http://blog.csdn.net/luoshengyang/article/details/6581828 在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以 ...

  4. ctkPlugin插件系统实现项目插件式开发

    插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有 ...

  5. 人人公益模式系统开发app

    人人公益模式系统开发app(微or电 158.1500.1390 小凡团队)人人公益系统开发,人人公益系统模式定制,人人公益系统开发模式,人人公益平台开发系统,人人公益APP系统开发. 深圳人人优益网 ...

  6. 果园种植系统开发App,游戏+商业模式?

    果园种植全返系统开发,英伦果园开发,微信果园种植系统开发,百果生态乐园开发,淘金农夫开发,农场果园种植游戏系统,果园种植APP系统开发,果园种植软件开发找陈牧150-1315-1740(微/电)开发者 ...

  7. 一点公益二码公益开发模式系统源码App

    写这篇文章,是因为最近看到的一个著名的开源项目在内部使用时的各种问题,不得不说,很多的开源的东西思想是不错的,但离真正工程化都有不小的距离,所以没什么商业公司采用的开源产品如果要引入的话一定要慎重,通 ...

  8. 二十八、带给我们一种新的编码思路——EFW框架CS系统开发中的MVC模式探讨

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...

  9. 皮皮果模式系统开发app

    皮皮果系统定制开发,皮皮果网站系统开发. 皮皮果游戏横空出世,比QQ农场有过之而无不及,深得广大玩家喜爱.无论草根百姓还是达官贵人,都可以来学习娱乐的游戏.让你在娱乐中收获物质生活和精神生活,英伦果园 ...

随机推荐

  1. 学习使用:before和:after伪元素

    http://www.w3cplus.com/css3/learning-to-use-the-before-and-after-pseudo-elements-in-css.html

  2. tyvj1011 - 传纸条 ——DP

    题目链接:https://www.tyvj.cn/Problem_Show.aspx?id=1011 状态转移方程: f[k,x1,x2] = max(f[k-1,x1,x2],f[k-1,x1-1, ...

  3. linux下重启mysql php nginx

    #  /etc/init.d/mysql restart #  /etc/init.d/php-fpm restart #  /etc/init.d/nginx restart

  4. Java——线程间通信问题

     wait和sleep区别: 1.wait可以指定时间可以不指定.     sleep必须指定时间. 2.在同步时,对cpu的执行权和锁的处理不同.     wait:释放执行权,释放锁.     ...

  5. Python中的repr()函数

    Python 有办法将任意值转为字符串:将它传入repr() 或str() 函数. 函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供解释器读取的形式. 在python的官方AP ...

  6. linux工具之log4j-LogBack-slf4j-commons-logging

    log4j http://commons.apache.org/proper/commons-logging/ http://logging.apache.org/log4j/2.x/ The Com ...

  7. Postman接口测试初探

    Postman接口测试 有两种安装方式: 1)Chrome插件(https://www.getpostman.com/).安装完成后,它会在chrome的应用中,如下图 2)通过下载Native ap ...

  8. css_样式样式器的分类

    详情:http://www.w3school.com.cn/h.asp 1.标签样式器:此样式器仅对html页面中div标签有效果 div{ background-color: rosybrown; ...

  9. Apache 性能优化

    有一个升级服务器,这几天一直访问的比较慢.导致部分用户升级不了.看了一下服务器的负载,发现 CPU和内存占用的都不是很高,可能是Apache配置不当造成的,一番搜索,找到了MPM的配置,提速很明显哦 ...

  10. SELECT INTO 和 INSERT INTO SELECT 两种表复制语句.txt

    Insert是T-sql中常用语句,Insert INTO table(field1,field2,...) values(value1,value2,...)这种形式的在应用程序开发中必不可少.但我 ...