一种松耦合的分层插件系统的设计和实现
睿丰德科技 专注RFID识别技术和条码识别技术与管理软件的集成项目。质量追溯系统、MES系统、金蝶与条码系统对接、用友与条码系统对接
C++编写的桌面软件中传统的App+Dll的架构已经显现出的模块之间的强耦合、维护性差、升级不方便等诸多弊端,为此我进行了一些思考,有兴趣的朋友请看我以前的一个思考片断:《Windows平台下C++插件系统实现的几个关键技术问题及其解决思路》,今天则具体介绍的我的一个具体设计和实现。
我的目标是要去除功能模块的相互依赖,在模块调用必须采用动态加载的办法,但同时各个模块可以进行自由地进行通讯。我的设想大致是这样的:在动态加载各个模块后调用统一接口后生成插件对象,在某个插件对象都能通过标识符找到其它的插件对象,通过统一的接口将数据传给它们。系统架构图如下:
系统流程图如下:
大家可以看到,要构建这样的系统需要解决两个关键问题:
1. 如何动态加载dll创建插件对象以及插件基类对象的接口设计
2. 插件模块之间的通讯问题
如何解决这两个问题我已有了基本的思路。为了验证我的思路是可行的,我用VC2008新建了一个LayeredArchit解决方案,该解决方案实现这样一个简单功能:统计指定目录下的文件数,然后将统计结果保存到一个文本文件。这个解决方案由以下工程组成:
BaseObjLib —— 底层库,用于定义底层对象和接口
StatFile —— 统计文件插件
OutputFile —— 将统计结果输出到文本文件的插件
CmdApp —— 一个主调用程序(是一个控制台程序)。
在每个插件模块都实现一个插件对象,继承基类插件对象IPluginObj,里都有这样一个统一的插件导出接口来生成插件对象:
[cpp] view plaincopy