本文主要简单介绍构建一个插件式软件平台所需要考虑的问题,文中主要介绍基于COM的插件式设计,目前大多数客户端选择基于COM的组件式设计,VC++中的MFC/ATL等框架也对COM做了很好的支持。当然文中所述的解决方案,使用非COM的方式也可以实现,实现原理是一样的。例如,著名的开源项目Miranda,即使用C/C++实现类似本文所述的插件机制。在下篇文章《插件式软件结构设计(二):构建基于DSkinLite的界面解决方案》中将讨论如何插件式软件的界面解决方案。
客户端软件的组件化是目前很多软件设计的选择,其优势有如下几点:
- 功能模块划分,使软件结构清晰
很容易想到将根据功能的不同划分成不同的模块。 - 任务分配容易 有利于团队协作
充分利用COM的优势,减少组件之间开发方面的依赖。不同的组件如果有调用关系,则只需要在开发初期约定好IDL接口文件即可。依赖双方可以在互不影响的情况下各自开发,并且在集成测试时不需要做任何改动。
-
适合敏捷开发,开发过程中模块更新,软件重构容易
功能模块的划分,使得迭代软件开发更加容易,同时业务变更,产品变更对软件开发的影响较少。
1 组件分类
我们可以将组件分为以下3类:
逻辑组件,仅提供一些信息获取等功能,不跟界面打交道,这类组件可以以插件的方式存在,放入插件管理器管理。
提供基础服务的组件,比如网络服务模块,可以置于主程序中
有界面的组件模块,这类组件可以以插件的方式独立存在。
逻辑组件,提供特定的逻辑处理服务。例如:股票相关操作或信息获取接口:
1: HRESULT QueryStockInfo( LPCTSTR strStockID, LPCTSTR strInfo);
2: HRESULT BuyStock( LPCTSTR strStockID, int nNumber);
这样根据业务或功能的不同,可以划分不同的功能模块,形成逻辑上相对独立的模块。可以以插件加载入主程序后,其他模块都可以使用此模块提供的功能。
基础服务组件,提供软件的相关基础服务,如网络模块,日志模块。这部分组件可能以独立的dll或者lib出现,并且不放入插件管理器中,以为其提供的功能是基础功能,一般都是需要的,因此不需要将其插件化。如网络模块:
1: BOOL HttpOpenRequest(HANDLE hXLNet, LPCTSTR lpszVerb,
2: LPCTSTR lpszObjectName);
3: BOOL HttpQueryInfo(HANDLE hXLNet, DWORD dwInfoLevel,
4: LPVOID lpvBuffer);
有界面的组件模块,提供相关业务功能服务,同时其带有界面控件处理。这类组件可以以独立的组件或者插件的方式封装。如: