一、概念
在这里,可扩充架构系统仅仅是指使用了类似Plugin(Add-in)技术的系统,它可以通过加载不同功能模块文件来动态添加整个系统的功能。
二、使用可扩充架构系统的目的
就我们公司来讲,我们公司的软件成品愈来愈多,涉及到了电力行业的多个专业领域,但是,每个软件都是比较独立的系统,只适合特定范围内使用。而现实是我们需要电力行业完整的软件解决方案,这就出现了很多的问题:电力行业的专业范围很大,不太可能一下子弄清所有电力业务知识,即使弄清了,一下子做完整功能的软件会需要很长的开发时间,是开发方和使用方都无法承受的一个时间,所以只能逐步独立地开发单一功能系统,再集成。我们公司就是这么在开发。但是现在又出现了问题,由于业务的需要,一个用户可能会需要多个系统中的一部分或全部功能,这种需求有时又是动态变化的,这样就要求开发方需要随时的调整软件系统提供的功能,这使开发方的软件开发成本和维护成本随着软件系统的增加而急剧长升。我们公司目前已经面临这种情况,急需尽快解决这个问题。可扩充架构系统从技术角度上提供了解决或缓解这个问题的一个方案,可扩充架构系统方案提供了以下特性:
1) 开发方便
① 主程序完成后很长一段时间内可以不需要随着系统功能的添加而重新修改编译。
② 整个系统的功能可以用独立开发的程序模块文件(即是插件,以后只称作插件)随意组装,添加功能时只需要开发特别的插件,并且可以利用其他插件提供的功能。
③ 可以根据开发人员的技术和业务水平灵活分配开发任务,降低对开发人员掌握知识的要求。
④ 由于插件独立,更容易发现和改正Bug,提高软件质量。
⑤ 软件技术升级容易,只要重写某个插件的实现就可以了。(现在C/S组遇到的数据库存取引擎的选择就是一个问题,决定单一使用BDE、ADO或是其他都要增加很多的工作量,来完成从一种引擎转换到另一种)
2) 维护方便:
① 安装方便:安装一个主程序,功能可以根据用户需要自由选择插件而扩充
② 升级容易:只需要替换或增加插件
③ 简化用户支持,用户可以在线升级
3) 公司软件事业发展
① 降低了对开发人员培训的要求
② 容易控制软件技术发展路线
③ 核心技术代码保密性容易被控制
④ 可以灵活组装产品系列
⑤ 可以开放接口供第三方使用,扩大影响力
⑥ 可以产生其他的盈利形式和销售模式
三、可行性分析
1) 技术可行性
Plugin技术是一个被广泛使用的技术,可以说是非常成熟,成功应用的例子不计其数:PhotoShop,ACDSee,Msn
Messenger,Media Player,VS.net ,Delphi 等等。所以说,从技术上肯定可行,没有风险。
2) 技术开发能力
目前,开发人员掌握这项技术的不多。但是这个技术涉及到的其他技术很少,很容易理解和掌握。就拿Com+技术和它相比,我认为难度应该降低了一个数量级。我们的开发人员很容易就可以掌握应用。
3) 与已有老系统的兼容
老系统可以不作任何修改地简单地集成到这个主框架中,这时主框架只是起到一个”托盘”的作用,只是管理启动老系统的快捷方式。这与目前的使用状况相差不大,只是增加了用户使用的方便性,各老系统还是独立工作。
老系统的功能要能够被其他新开发的系统直接调用在目前是办不到的,如果要做到可以被调用,只有两条路①修改老系统和新系统的工作方式②直接把老系统的代码编译到新系统中(要求部分或全部代码在同一个编译器下编译,代码升级修改很困难,要增加测试维护工作,而且难以一劳永逸)。
在可扩充架构下,老系统的功能要能够方便地被新系统调用,老系统也必须修改,但是可以不必在同一编译器下编译,并且一劳永逸。
所以,结论是:老系统要么不修改,如果要修改,只有修改到可扩充架构中才是较好的选择,长远来看,可能是必然选择。
4) 难点
① 需要通盘考虑,整体规划
② 因为要功能共用,所以需要定义公共接口
③ 由于模块协作多了,所以编程需要提高代码质量
④ 需要技术钻研和培训(两个星期左右)
四、技术方案
目前我设计的方案参考了Delphi IDE的OpenApi和使用了JvPlugin(修改过了,更名EtsPlugin),总体上类说,是这样一种技术解决方案:Interface+Plugin控件,具体技术方案描述如下:
接口框架结构图
说明:如图所示,公共接口分为两大类,第一类是EtsOpenApi----定制IDE界面和行为的开放接口由IDE环境实现,第二类是公共业务功能服务接口,由插件提供实现。
在开发时,IDE在运行时会初始化了一个全局接口变量EtsIDEServices供各个Plugin调用,这个接口可以转化为各个下级接口(如ImenuServices、ItoolBarServices等)后直接调用。第二类接口由Plugin提供实现和公布调用接口,使用时由(EtsIDEServices
as IpluginServices)的方法来查询是否存在公布的接口,如果有就可以调用接口函数了。
插件的编写实际上是开发一个Dll或Bpl,为了简化开发工作,减少工作量我使用了JEDI小组的JvPluin控件,把它分离出来修改了一部分代码,并提供了一个工程向导(安装控件后,用File—New—Others…的Projects页中会出现“Ets
Plugin向导”)。插件可以使用EtsOpenApi来增加自己被调用的方式(增加菜单项、增加ToolBar)。
所以开发工作被分为了独立的两部分:
1) IDE的开发,包括EtsOpenApi的实现
2) 提供公共服务的插件(每个插件的功能如果要被公用,则要提供接口定义单元)
(PS:目前,我几经编码完成了这些部分:EtsPlugin控件和工程向导、IDE雏形、EtsOpenApi的部分定义、AdoDataLayer插件的Demo版本、DataReport(报表打印)插件的Demo版本。完整的源程序在\\Software-laj\Share_只读\Plugin系统架构下)
|