3
、
回调机制的实现机理
在介绍回调机制原理之前,先讨论一下“回调机制”与“回调”两个概念。前面提到的回调(callback)是MapInfo提供的一种向客户程序反馈消息的过程,单纯的理解它是单向的,即从后台到前台的过程。对于这种开发方式,单向且前台与后台没有交互的话,系统很难实现稍复杂的GIS操作。因而,出于系统考虑,本文将客户到后台、后台到客户以及两者交互的整个过程统称为“回调机制”,统称这种二次开发方式为“回调机制”的实现。
.NET
的COM组件包装器wrapper封装的过程相当复杂,而且是在.NET内部实现的,要了解该过程的理论实现请参见
[2]
。在Visual Studio 2005中打开或新建一个工程后,打开“添加引用”在“COM”项中找到“MapInfo 8.0 OLE Automation Type Library”,单击“确定”之后,该COM组件就被加载到工程中了。另外,.NET会在工程文件中创建程序集文件“Interop.MapInfo.dll”(如图1,中上部方框),它是带有.NET包装器类的.NET程序集。打开“对象浏览器”找到该程序集就可以浏览其内部的类及相关接口。使用时,在相关程序文件中加载语句“Using MapInfo”(“MapInfo”是.NET所谓的“命名空间”,并不等于程序集名称)。
在本文所述的系统中,按照软件内部各部分之间的关系,进行了宏观上的抽象,大体可以分成三大部分:(如图1)客户组件、回调组件以及后台服务端组件。程序运行后,外在的窗体就相当于客户组件,它主要负责与用户交互,调出并显示后台MapInfo地图窗口显示地图,打开并链接数据库、属性数据处理等相关操作;所谓“后台服务端”组件,就相当于一个MapInfo服务器程序,抽象地说,它其实就做一项工作:接受外来指令并将处理后的结果返还客户程序;回调组件,已经不是上面所提到的COM对象引用(“Interop.MapInfo.dll”),在本系统中,它被二次封装,封装后的结果相当于一个纯.NET组件,即这里所指的“回调组件”(具体封装见文章第四部分),其作用主要是负责后台的启动、关闭、控制等等复杂操作,用来协调客户程序与后台程序的交互问题,这部分是系统成败的关键。