基于插件技术的GIS应用框架(C# + ArcEngine9.3)(一)
-------------------------几个问题
一直想把原来用Delphi写的GIS应用框架进行升级,可由于家庭和工作牵扯了太多的精力,没能如愿,最近一段时间,终于研墨执笔开始了框架的升级工作,历时一个多月,终于新鲜出炉了,现在静下心来进行总结,以提炼我这一个多月的辛劳与汗水。
一、关于平台的选择
实际上本人一直从未用过Visual Studio,更未用C#做过一个完整的项目,其实就开发平台而言并不存在太多的差异,就像.net框架和J2EE的包,以及delphi的VCL,他们的思想其实都是大同小异的,语言使用到了一定的高度,有了一定的积累,转换到另外一种语言,困难就小多了。其实只要支持COM的语言都可以用来进行GIS框架的开发,之所以采用C#开发新版本的GIS应用框架,对于自己来说无非是两点:第一,界面更加完美;第二,就是想检验一下自己的学习能力。
二、关于ArcEngine接口的选择
这个问题我觉得很重要,看过很多人家的代码以及成型的系统,似乎都乐意采用ToolbarControl这个东西,我研究了一段时间,这个东西不仅控制麻烦,而且会带来很多负面问题,比如,我无法在ToolbarControl里加入自己的控制逻辑,而且更糟糕的是,对于想要保存自己定制内容的程序员来说,这样的封装显得太过了。此外,比如IEngineEditor接口的选择,这个接口提供了很强大的功能,对于编辑任务和编辑图层几乎可以不用写什么代码就能实现,但是编辑任务和编辑图层两个列表都必须出现在ToolbarControl中,这对于我这个追求完美的人来说,无疑是个灾难,所以在我是框架里,抛弃了ToolbarControl和IEngineEditor这个对于很多程序员来说非常方便的东西,IEngineEditor的功能基本上完全靠自己代码来实现,编辑任务、编辑图层等都以插件的形式出现在自己的框架里,既做到了界面风格统一,也做到了功能完全可以自定义。当然这背后的代价是你自己编写行数不菲的代码。
三、关于事件
开发GIS应用框架,最核心的一个问题就是事件的处理了,毕竟有了事件,所有的插件对象才能有机地构成一个整体,这也是所有插件对象进行协同工作的基础所在。COM提供了连接点的机制来进行事件的发布,而C#则较为简单,可以直接通过事件代理的形式来处理,这样一来,所有客户插件感兴趣的MapControl事件和PageLayoutControl事件即可以方便的通过事件代理来获得框架的调用。
四、关于反射
.net 的反射机制的确是个好东西,获取插件的类型信息易如反掌,只是本人没有深入研究,在这里也就不赘叙了。
五、关于插件的加载与保存
实际上有很多种方式可以对定制的结果进行保存,比如:结构化存储文件,xml等等,在本文论及的框架里,选择了后者,不光是因为插件的加载与否,如何加载只需要简单的进行XML配置就可以实现,而且也便于单独调式某个插件或某一组插件。