闻 平,王 冲,杨林波,陈 科,谢 飞
(中国水电顾问集团昆明勘测设计研究院,云南昆明650051)
GIS软件经过几十年的发展,已经从最初的空间数据存储和显示的简单应用转换为高级地理统计、空间分析和地理服务等方面的应用。GIS应用的领域已越来越广泛,应用的方向和工程的复杂度也不断增大,特别是针对我院多部门之间共同开展的GIS技术应用与研究,不同的部门有不同的需求,业务需求变化多端,如果继续按照以往的软件开发过程来实施,每个项目从头做起,不同项目的复用部分也仅仅是停留在代码的简单复制与粘贴上面,这样的技术与方法伸缩性较差,不仅不能满足软件的扩展与可复用的需求,也不能充分发挥多部门、多人之间的协作关系。为改变上述情况以适应不断衍生的业务需求,GIS软件需要拥有结构清晰简洁、支持复用、可扩展性强和易于维护等高性能架构。插件式GIS应用框架是解决上述问题的比较好的技术途径。本文基于.NET平台设计了面向应用型的插件式GIS应用框架,并对其实现关键技术进行了深入研究,将研究成果应用于实际,取得了较好的应用效果。
插件(plugin)是按照预定接口实现的软件功能构件。应用程序可在“运行时”动态加载插件并执行其功能。插件技术是一种提高软件复用性和可扩展性的有效方法。插件技术使应用软件功能具有很好伸缩性,在软件领域已有较广泛的应用。
插件的实现一般有3种技术:基于动态链接库DLL的插件、基于组件对象模型COM的插件和基于.NET反射技术的插件。
1)动态链接库是具有某种功能的一种软件模块。动态链接库文件本身并不能独立运行,但它能够被其他程序调用实现。基于这种特性,使用动态链接库也能产生插件对象。
2)组件对象模型COM是一种组件二进制级别的交互标准。它以COM接口作为不同组件之间通信的通道,只要实现了COM标准,使用任何一种支持COM语言编写的组件都能够互相调用。
3)在.NET Framework中,使用.NET的反射机制和接口技术,也能够产生插件。.NET平台动态加载一个插件程序集(assembly)后,可以通过反射机制,获得程序集中的类型信息。如果类型信息满足主程序的要求,主程序将使用对象动态生成技术在内存中根据类型定义产生一个插件对象实例并加载到插件池中[2]。本文后面所提到的插件的开发就是基于.NET反射技术实现的。
本文所述的插件式GIS应用框架主要包括了4个组成部分,如图1所示。
1)主界面程序:该程序是以EXE可执行文件的形式存在,主要负责生成按钮、工具、工具条和菜单等界面UI对象,并负责将这些对象事件进行委托关联。
2)插件引擎:提取插件程序集中包含的插件类型信息,并负责将其生成相应的插件对象。
3)通信契约:主程序与插件之间相互认可的一种标准,以接口的形式存在,即只有实现了规定接口的类型对象才能被插件引擎认可为插件。
4)插件:插件式框架具体功能的实现,插件式框架模型将一个程序的功能划分为相对独立的模块,每一个模块就以一个单独的插件形式存在。
图1 插件式GIS应用框架结构图
插件式GIS应用框架结构中,GIS系统主程序简化为只负责激活应用框架核心组件。这样小而轻的主程序有利于减少系统启动等待时间和方便软件部署与更新。应用框架支撑着整个插件式GIS应用软件的结构,负责动态加载插件,根据插件配置生成交互界面,协调插件间的互操作等。
插件式GIS应用框架实现的关键技术包括接口的设计与实现、插件的动态加载、插件的调用等。
本文所述的插件式GIS应用框架主要实现了以下7个接口:①IApplication接口;②IPlugin接口;③ICommand接口;④ITool接口;⑤IToolbarDef接口;⑥IMenuDef接口;⑦IDockableWindowDef接口,其接口关系如图2所示。
图2 接口关系图
本系统将插件统一放在一个文件夹(plugin)中,在主程序启动时即可去查找该文件夹并创建可用的插件对象。当用户需要增加新的功能时,只需要将符合接口的新的程序集放在plugin文件夹中,重新启动主程序即可完成功能的添加。同理,当用户需要删减一个功能时,只需要将实现该功能的程序集移除plugin文件夹,重新启动主程序即可完成功能的删减。
本框架中插件的动态加载使用了.NET的反射机制,它能根据一个插件类型的描述信息产生插件对象,插件的动态加载过程如下。
1)首先使用一个静态方法探测启动路径下的plugin文件夹是否存在,如果不存在,将自动新建一个plugin文件夹避免出现异常
如果插件文件夹存在,将寻找该文件夹中所有的DLL文件并返回一个包含了文件路径的字符串数组。
2)系统遍历文件路径数组,从中得到每一个程序集文件的绝对路径,然后将其动态加载。
3)系统识别类型的每一个接口,如果该类型的某个接口完整名为ICommand、ITool、IToolbarDef、IMenuDef或IDockableWindowDef中的一种,系统将认定该类型是一个有效的插件类型并根据该类型名产生一个实例对象。
针对不同的插件,插件管理器获取插件后,主程序根据插件信息生成并调用相应的插件,且在主程序的系统界面上生成相应的菜单和工具栏。如ICommand表现为命令按钮;ITool表现为工具按钮;IMenuDef表现为菜单栏;IToolbarDef表现为工具条。后两者均为ICommand命令按钮和ITool工具按钮的停靠对象。
本文以.NET平台为开发环境,通过C#,AcrGIS Engine 10.0组件和Skyline Globe组件完整的实现了一个插件式GIS应用框架。系统中所有功能模块都是以插件的形式实现,通过拷贝插件到系统指定目录下即可被应用框架自动调用,系统主界面如图3所示。
本文从系统框架、接口实现和加载等方面讨论了插件式GIS应用框架的实现过程,并结合实践,搭建了一个完整的插件式GIS应用框架。只要定义好了接口规范,后期便可以利用插件对系统的功能进行很好的扩展,减少重复工作,能在很大程度上提高工作效率,降低开发成本和后期维护成本。
图3 系统主界面
[1]陈方明,陈奇.基于插件思想的可重用软件设计与实现[J].计算机工程与设计,2005,26(1):172-173.
[2]蒋波涛.插件式GIS应用框架的设计与实现[M].北京:电子工业出版社,2008.
[3]高慧萍,吕俊.插件式开发技术研究与实现[J].计算机工程与设计,2009,30(16):3805-3807.
[4]张毅,李国卿,赵军喜,等.插件式GIS应用框架关键技术研究[J].测绘科学技术学报,2010,27(4) :298-301.
[5]江丽钧,谈晓珊,孙毅中.基于插件的城市规划信息系统的研究[J].现代测绘,2010,33(1):8-10.
[6]卢学鹤,余光辉,温小荣,等.基于插件技术的森林资源GIS的设计与实现[J].南京林业大学学报:自然科学版,2009,33(1):127-130.
[7]杨世琦,徐永近,高阳华.基于插件技术的测土施肥决策系统设计[J].西南师范大学学报:自然科学版,2010,35(1):158-163.