今天跟大家分享一下我们在日常开发中并不常用的开发模式“插件系统模式”,什么叫插件从大一点的概念讲就是我们开发的软件是由很小的模块组成,每一块都能成功的装卸,使我们的软件成为一个有机体,在发生重大事故、改良优化等等的时候,我们不需要重新编译我们的系统就能很方便的进行升级替换进行使用;这样的开发模式就是插件系统开发模式;这个概念很大,每个人的技术水平不同使用的效果也是不同的;一个大型的系统,不能简简单单的用三层或者MVC来概括,我们要站在一个更高的角度去思考程序,每当我们开始一个新系统的架构设计时,我们不能总是保守的或是“封建”式的使用以往的思想模式,是否深思熟虑过这些开始模式在我们当前系统中是否可用或者说是否能发挥模式的最大效果,但是我们往往很多人,不太喜欢思考,俗话说得好:思考是前进的本质;尽量向“建筑的永横之道”一书中所讲的道理去迈进,这书不仅仅在建筑行业是经典,其实在各行各业道理都是想通的,我们不能停止脚步,我们要时刻保持热身状态,只有这样我们才不会在大难临头时,浑身无力或者由于肌肉长时间不运动导致反应迟钝;我写文章就喜欢乱扯,请大家不要见怪,本人属于一种很讨厌自以为是的那些家伙,在我的文章中我可能经常性的提到,技术不是用来炫耀的,更不是用来获得别人尊重的筹码;当你看到不喜欢的文章或者言语过于激励的时候,我们能以一种平和的心态去判断文章的价值;我们不去评价写文章的这个人的个人品德问题,只要他分享他的经验就是值得尊重的;搞程序的人不喜欢拐弯抹角,直来直往,对自己不喜欢的东西就是不喜欢,没有理由更不需要借口;但是在技术的圈子里如果人人都是这样一种心态的话,大家很难和睦相处,虽然在虚拟的计算机网络世界里,没人知道你是谁,长时间这样下去,其实从长远角度来说是不好的;习惯成自然嘛,学技术就是学做人,不管是初学者还是高手,在成长的道路中大家都是一路人,都经历过相同的历程,好了废话就不唠叨了,我们进入今天的主题;[王清培版权所有,转载请给出署名]
插件系统在很早之前就出现了,包括我们的VisualStudio开发工具的原型都是用的这种模式,我上面也说了每个人的技术水品不同使用的效果也是不同的,我跟大家分享一下我对插件模式的理解和在项目中的使用经验;我将插件系统大体抽象成下图结构:
1:
上图很清晰的描述了我们插件系统的整体执行步骤,我们将应用程序的整个生命周期进行抽象(抽象是我们程序员必备思想,要随时具备抽象化准备),不管什么应用程序都有前后执行顺序,我只是用Main表示一下,在开始执行前我们需要读取插件所在的路径然后进行插件对象的全路径保存,以便在后面运行时方便加载;到了Run开始真正的执行我们的应用程序了,我们需要根据插件的类型进行加载,插件必须具备类型的原则,用在什么地方的,好比汽车的零部件,我们有明确的规定,这里的实现我们可以用接口进行标识;当程序开始结束的时候,我们需要释放各个插件所占用的系统资源,为什么我们要手动释放这些资源呢,有的朋友会说不是用CLR的GC吗?GC只能释放托管资源,非托管资源它管不到,在我们进行P/Invoke平台调用时候,资源释放是比较复杂的,由于托管和非托管的内存分配是不同的,至于怎么释放非托管资源我这里穿插一下我比较喜欢的方法吧,当我们用非托管C++编写核心且高效的系统功能时,往往它占用的资源是非常可观的,所以当我们调用完毕后在第一时间释放是必须的,我们可以进行托管封装,在非托管内部我们定义释放资源的方法,然后在通过P/Invoke调用释放资源的非托管方式进行释放;由于这里牵扯到.NET互操作方面的知识了,这这篇文章中我们就涉及了;有兴趣的朋友可以关注本人的“《.NET程序员学互操作》”分类文章中进行详细的讲解;
大概的原理我就讲这么多了,我们来看代码怎么实现吧;
2:
在我的解决方案中,Plug是插件有关的对象;在PlugInterface里面是所有插件接口,在LoadInterface文件里面是所有加载过程中的插件,我们需要明确插件的类型,只有这样才能很好的控制插件;软件的生命周期随着需求不同而不同,这里是需要我们去收集和提取的,在应用程序的整个生命周期中我们都可以无缝的装卸插件,那是多么美妙的事情;
3:
这是本人在公司的一个项目中的实现代码,由于代码属于公司所有,所以不便于公开;其实代码没什么技术含量就看怎么用了;OK,差不多讲完了;