[架构模式] 《插件式应用框架》
插件式应用框架插件技术是在软件的设计和开发过程中,将整个应用程序划分为宿主程序和插件对象两部分,宿主程序能够调用插件对象,插件对象能够在宿主程序上实现自己的逻辑,而两者的交互基于一种公共的通信契约。宿主程序可以独立于插件对象存在,即使没有任何插件对象,宿主程序的运行也不受影响,因此,我们可以在避免改变宿主程序的情况下通过增减插件或修改插件的方式增加或调整功能。由于使用了插件技术的宿主程序具备了一个框架的本质特征,因此可以将它看作是一种插件式框架。插件式框架能够有效地降低功能对象与对象管理逻辑之间的耦合程度,并将耦合置于最优的程度。对大部分计算机用户和软件开发者而言,插件式应用框架其实算不上什么神秘的东西,事实上,几乎每个人都曾使用过具有插件式功能的软件产品。这些软件有大有小,从操作简单的诸如播放器软件到复杂桀骜的各种专业应用软件,都或多或少采用过插件机制,只是对于最终用户而言,由于常常满足于使用一款成熟软件,很少有人刻意去关注这些软件使用的是什么样的架构体系。在Adobe Photoshop或WinAmp等应用软件中,都可以看到插件机制的影子。如给软件更换“皮肤”(Skin)时,用户只需要将新的皮肤文件复制到一个特定的文件夹中,启动软件后,就可以使用新的软件界面而无需软件开发商提供一个新的版本。如果读者使用过Photoshop,可能会常常寻找些不同的滤镜来生成各种特效,这些文件只需要拷贝到滤镜文件夹中,并通过对话框加载到Photoshop中即可使用。这便是插件式框架的一种简单应用。如果观察更仔细一点,我们将会发现许多常用的大中型软件都使用了插件式机制,如MS Office System、AutoCAD、Visual Studio.NET和Eclipse等。在这些产品中,以Eclipse平台最为著名,由于它的开源特性和可扩展性,全世界成千上万的爱好者和商业软件公司都基于Eclipse平台开发出了多种类型的插件,这些插件使Eclipse的功能变得越来越丰富和强大,反过来促进了自己的发展。一般而言,一款软件使用插件式框架机制的原因主要基于以下3点:n
可以在无需对程序进行重新编译和发布的条件下扩展程序的功能。n
可以在不需要程序源代码的环境下为程序增加新的功能。n
在一个程序的业务逻辑不断发生改变、新的规则频频加入时能够灵活适应。对许多专业软件而言,使用插件式框架机制开发应用软件是一种必然的选择。任何一款专业软件,无论项目研发人员在开发之前做过多么详细的用户调查和需求分析,都不可能满足使用该软件的每个行业、每个用户的全部需求。为了延长软件产品的生命周期,在避免修改软件程序主体的情况下,如果能通过一种具有良好扩展性的方式让软件根据用户实际需求实现“生长”,无疑具有极大的诱惑力。以GIS行业为例,由于不同部门管理和使用的GIS数据类型千差万别,业务流程也复杂多变,都必须根据实际情况开发自己专门的GIS软件,这也是GIS二次开发大行其道的主要原因,如果每个新应用项目都必须让开发人员从头构建,无疑是一种智力与经验的浪费,同时浪费的还有宝贵的开发时间。熟悉ESRI公司产品ArcGIS Desktop的GIS开发人员对插件式机制可能会有更深入的认识和了解。以ArcMap程序为例,它有两种扩展方式,一是在ArcMap中编写VBA(Visual Basic for Application)代码实现,VBA是一种标准工业级的内置集成编程环境,用户可以在这个内置环境中直接使用内置对象编写扩展代码,这些VBA代码将保存在一个mxd文件中,供ArcMap调用和分发;另一种是实现ArcObjects发布的ICommand、IMenuDef等插件接口,使用VC++、VB等语言编写满足一定要求的COM插件来扩充功能。在这两种情况中,ESRI的ArcMap软件就好像一个应用功能的容器,而GIS程序员可以根据自己的实际需要不断填充和增强这个容器的功能,这个容器为功能的扩展提供了无限的空间。使用了插件式机制的应用程序是一个框架,这个框架由于使用了插件架构,变得稳固且具有良好的可扩展性。扩展性的优点在于它屏蔽了宿主程序与插件对象之间复杂的交互和通信联系,第三方插件开发者无需关注框架的宿主程序是如何运行的,如何调用插件对象等复杂问题。事实上,他们完全无需了解框架的宿主程序是如何编写的,只须关心自己所要解决问题的处理逻辑,只要这个逻辑编写正确,并且符合插件式框架规定的格式和流程,这个插件文件就将能够被框架的宿主程序识别并安装。插件的实现一般有3种技术:基于动态链接库DLL的插件、基于组件对象模型COM的插件和基于.NET反射技术的插件。动态链接库是具有某种功能的一种软件模块,它只在需要时才被系统载入调用。动态链接库文件本身并不能独立运行,但它能够被其他程序调用实现,基于这种特性,使用动态链接库也能产生插件对象。组件对象模型COM是一种组件二进制级别的交互标准,它以COM接口作为不同组件之间通信的通道,只要实现了COM标准,使用任何一种支持COM语言编写的组件都能够互相调用。组件对象模型的核心是COM接口,ArcGIS软件就是基于COM技术进行插件开发的。在.NET Framework中,使用.NET的反射机制和接口技术,也能够产生插件。.NET平台动态加载一个插件程序集(Assembly)后,可以通过反射机制,获得程序集中的类型信息,如果类型信息满足宿主程序的要求,宿主程序将使用对象动态生成技术在内存中根据类型定义产生一个插件对象实例并加载到插件池中。由于插件对象与宿主对象通过接口进行识别,而接口携带了让两者互相通信所必需的属性和方法,因此,宿主程序能够调用插件对象,插件对象也能够将获自宿主程序的必要信息进行双向交互。本书讨论的插件式GIS应用框架NBGIS,正是基于.NET平台和C#的一种插件式应用,我们将使用这些技术为读者建构一个完整的插件式GIS应用框架。
页:
[1]