可扩展性与二次开发
1.基于插件的松耦合体系
在软件行业中普遍存在一种现象:软件企业特别是产品型的软件企业往往比较抗拒对产品中的功能做客户化修改。这种现象的出现并不全部是修改本身的工作量 的原因(大部分情况下修改的工作量实际上非常小),而在于这种修改要求软件企业为每一客户保有一个产品的版本库分支,将来对此客户的任何响应都要基于此一 分支,此一分支也不便于和主版本同步演进,这就会带来比较大的管理成本。特别是熟悉此一分支的骨干人员离职之后,对于客户的服务水平将会急剧下降。
针对此一问题,泽元软件构建了一套插件体系,并为此体系提供了基于Eclipse的ZDeveloper开发工具,使得客户的个性化需求通过可插拔的 插件来实现。特别地,ZDeveloper允许通过在插件中声明扩展点和扩展项来覆盖和扩展ZCMS中原有的功能,但又不影响产品本身的升级。通过这种方 式,每个项目只需要维护该项目特有的一个或几个插件的代码即可,项目版本库中的代码量急剧减少,代码的可读性、可维护性大增,又因为没有修改产品的核心代 码,因此只需要着重测试项目相关的插件即可,测试的工作量也随之大减,从而较好地兼顾了个性化实施和管理成本两个方面。
ZCMS中的插件非常类似于Eclipse中的插件,它是由一个.plugin文件所描述的旨在扩展其他插件的功能、并可向其他插件提供扩展点和扩展服务的一组遵循规范的业务逻辑及其页面,能够独立部署、启用和停用。一个插件由以下内容组成:
其中菜单、扩展服务、扩展点、扩展项、扩展行为由插件的.plugin配置文件描述,JAVA代码、JSP页面、国际化文件则是实际存在的磁盘文件,由.plugin文件记录其存放位置。
2.二次开发工具
ZCMS通过基于Eclipse的ZDeveloper(泽元开发平台)提供二次开发支持。通过ZDeveloper,ZCMS 允许专业JAVA开发人员为ZCMS创建插件,通过插件扩展ZCMS的UI界面、视图、菜单、定时任务、内容类型、互动功能、模板类型和模板标签,并允许 通过扩展点和扩展项干预系统包括权限、工作流、全文检索在内的各种行为。ZDeveloper还提供了数据库模型设计、数据库模型自动入库、数据库逆向建 模、SQL语句生成、CURD文件创建和全面的国际化功能,从而实现了业内最高规格的内容管理二次开发支持。
3.菜单的扩展
在ZCMS中,所有的功能菜单都由插件提供,系统启动时Framework会读取所有的.plugin文件,将其中的菜单注册到菜单管理器。如果部署并启用了某个插件,则此插件相关的菜单显示,否则菜单消失。
ZCMS的二次开发工程师可以通过在插件编辑器的Menus选项卡中添加菜单的方式为ZCMS添加新的功能菜单。
图:为ZCMS添加菜单
4.扩展服务和扩展项
某一插件实现的功能需要依赖于本插件定义的某一接口的子类的集合时,需要定义扩展服务。扩展服务是一个插件配置项,用于声明本插件的一个扩展项注册入口;扩展项也是一个插件配置项,用于声明向哪个扩展服务注册扩展项。扩展项指定的类必须实现扩展服务指定的接口。
例如:内容核心插件需要管理所有的模板标签,但内容核心插件不知道其他插件都实现了什么标签,所以需要提供一个模板标签扩展服务。其他插件则可以将自己实现的模板标签扩展项注册到此服务,从而通知内容核心在模板编译、执行、标签展示等环节使用此标签。
扩展服务的配置界面:
扩展项的配置界面:
5.扩展点和扩展行为
为了让一个插件的JAVA类或JSP页面运行到指定行数时,可以执行其他插件中的指定的程序逻辑(通常是额外的数据校验和处理逻辑),需要定义扩展点。
扩展点是一个插件配置项,用于声明本插件的一个扩展行为注册入口。程序执行到扩展点所在的行时会查找所有注册到该扩展点的扩展行为,并执行所有的扩展行为指定的类。扩展项也是一个插件配置项,用于声明向哪个扩展点注册扩展行为,并指定该扩展点被调用时执行的类。
扩展点类型于SWING中的事件(Event),扩展行为则类似于监听器(Listener)。
例如:文章编辑插件在文章保存的JAVA方法中增加了一个扩展点,其他插件可以通过注册扩展方法到这个扩展点,实现文章信息保存之前的预先检查是否有不文明词汇等。
扩展点配置界面:
扩展行为配置界面: