插件式应用程序的智慧

来源:互联网 发布:淘宝售假扣24分影响 编辑:程序博客网 时间:2024/06/02 19:08
插件式应用程序的智慧
        不知你经手过的应用程序项目会不会存在这样的情况:1.开发前说好功能分配到个人,可到头来别人写的却只是功能类库,你还是需要在主程序中调用它们;2.主程序存在大量的静态成员,同时对应的类库也或多或少的存在一些和主程序相关的静态成员;3.由于主程序功能太多,导致代码页中事件过多,代码冗长;4.客户偶尔要求添加或删除某个功能,你至少得找到主程序的源码,同时在界面中添加或删除某个功能,最后重新编译系统,实在太麻烦;5.同一个产品不同用户对于功能的要求不尽相同,你还得制作多个不同版本,即便是通过配置文件来实现功能的隐藏,但却也无法改变对象已被创建的事实。
       你是否希望有一个这样的项目,可以将应用程序的各个功能的开发分配到个人,每个功能都对应一个类,开发完成后,他会自动集成到主界面中去;同时,主程序代码简约,整个应用程序没有或极少存在静态成员;添加一个新功能乃至几个大型的工具条,都无需再次打开旧的源码了重新编译;如果想注销界面里的指定的功能,只需要在配置文件中稍加记录,便可使整个系统在重新启动后,不在创建该对象的实例,实现真正的“瘦身”。
       你是否会因为VS编译器在你安装过SVN后,
主菜单上多了一个“VisualSVN”菜单项而感到好奇;你是否会因为ArcGIS Desktop支持用户自己开发,拓展系统功能而感到高级;你是否会因为Photoshop在加载界面时,会不断出现扫描系统文件(如:DLL文件)而感到帅气;你是否会因为ArcMap可以通过加载对话框,选择有效地文件(如:DLL文件)后,瞬间使界面上便出现一个或多个工具条而感到神奇。
       其实,这些都是插件结构可以帮你解决和做到的。 要知道,所有大型的桌面应用程序基本使用的都是插件的结构,如:Office些列软件、ArcGIS Desktop系列软件、AutoCAD等等。下面我们来简单看一下插件结构。
       一个插件应用程序主要五个部分组成:宿主对象、插件引擎
、通信契约、各个插件对象、通信
       宿主对象:顾名思义就是各个插件对象展现后所寄宿的实体对象,它就是用户看到的最终的界面部分,也就是我们常规开发里称的主程序。其实,一个插件应用程序的宿主对象不过只是一个简单地框架罢了,里面只需调用“插件引擎”并传入“通信”就可以的,一共加起来不过百十行代码而已。(当然你也可以加入一些配置文件之类的东西,这些就另当别论。)这样的主程序就不会出现代码冗长的问题了。  
       插件引擎:就是将文件(即:编译后的系统文件,如:DLL文件)中的各个插件对象,通过反射机制将它们逐一读取,并依据“通信契约”将其分门别类的放入插件集合字典,再将它们转化成对应的实体对象,同时传入“通信钩子”,最终将其集成到宿主对象中去。插件引擎是整个插件系统的核心,它的实质就是如何将插件变成界面的操作对象。由此,只要有符合要求的编译文件,通过插件引擎就可以实现系统的无限拓展。当然,你也可以将不需要的插件对象,在系统读取插件时就将其屏蔽,实现真正的“瘦身”。
       通信契约:是一个定义了不同插件对象接口和继承这些接口类的集合,用于标识和区分各个不同种类的插件对象,以及定义某种插件对象的基本信息。因此,我们只要继承对应的插件接口就可以不断添加新功能,而无需重新编译系统。
       各个插件对象:是继承某一“通信契约”接口的插件对象,它是一个界面对象的具体实现者。这样我们便可以实现,一个界面对象对应一个类。同时,也可以正真的实现一个成员开发一个或多个功能,而无需再花时间将各功能集成到主界面中去(因为有插件引擎帮你自动处理)。当某一功能出现异常,我们便可直接到对应的类中去寻找原因,无需再在一堆混乱的源码中苦苦寻觅。
       
通信钩子:可以是一个或多个类或接口,它主要用于数据的通信,将宿主对象中要处理的数据或要操作的对象,关联到各个插件对象中去。有了这样的钩子作为整个系统通信的使者,你还需要定义如此之多的静态成员吗!
        总的来看,一个
插件式应用程序启动后,系统会检索和读取指定目录下存放的插件文件,通过反射机制查询里面所包含的插件对象,将符合条件的插件对象反射成实例,分门别类的放入插件集合字典中,再将它们转化成对应的实体对象同时传入“通信钩子”,最终集成到宿主对象中去。
       由此看来,SVN只不过是在知道VS“通信契约”和“通信钩子”的前提下,对VS编译器进行了简单地拓展;
ArcGIS Desktop支持用户自己开发拓展系统功能,只是因为它公布了桌面产品的“通信钩子”和“通信契约”;Photoshop在加载时,不断出现扫描系统文件,原来是在读取和解析插件文件; ArcMap软件通过加载效地文件(如:DLL文件产生新的工具条不过是“插件引擎”读取和创建了插件实体对象罢了。
        虽然,桌面应用程序已经渐渐淡出我们的视线,市场的需求也越来越少,但是插件开发的思想依然可以给我们很多的启示,从中也可以能学到很多的知识,这些都会使我们受用终生。

相关链接:
基于 LiuZhenHong.Controls 2.X 控件开发的插件应用程序Demo:
 
http://download.csdn.net/detail/ll_zz_hh_/6022221 

                                                                                                     —————— 毅依 应鸿
                                                                                                    二零一三年 八月二十七日 
原创粉丝点击