为Delphi定制的中间件 最新2.10版本 日期:2008-8-13 出处:http://computer.mblogger.cn/wpy020327 推荐:桥夫(wpy020327) 人气:2590
|
|
一套专门为delphi程序员编写的国产三层架构开发系统,中间件部分封装了多节点组网、寻址路由、信息交换等部分的实现过程与细节,而客户端部分包含了应用开发的组件包,由16个控件组成。
系统架构清晰合理、功能强大,支持业务逻辑部件的开发及远程自动挂接与调用。系统没有不宜理解的各种Com/DCom/Com+及Midas等相关概念,只要有初步的delphi开发经验就能轻松上手。
系统组网灵活、配置与部署省力、功能扩充能力强,是Delphi程序员开发三层架构系统或其它跨Internet应用项目的有力工具。
QBurro中间件的组网及对象命名规则 QuickBurro中间件的优势在于灵活的组网、寻址、路由及信息交换能力。凡是使用该中间件的多个局域网或个人电脑,可以在Internet环境逻辑上“联结”成一个虚拟专用网,并由中间件软件自动维持连接及互相通信。
如下图所示,信息的交换可分成两类,一是WAN通信,另一种是LAN通信,中间件实现前者,而后者则是利用客户端开发包实现的与节点服务器之间的通信或其它类型的内网通信。中间件实现的通信部分已经实现封装,故对客户端应用程序透明。这样的组网非常灵活,大到可以是有大量法人单位参与的大型网络,小则可以仅有一个根接点和一个子节点。
而数据库服务器与应用服务器(运行中间件的服务器)的部署也是很灵活的,若一个节点有大量应用数据的,则可以将数据库服务器与应用服务器分离,否则,两者可以合在一个物理服务器上运行;对于没有应用数据的,可以使用QuickBurro自带的SQL Server高度精简版来存储节点系统数据。
[图 请参见http://computer.mblogger.cn/wpy020327]
上图所标出的节点代码是示例性质的,但您不难看出这种带“#”号形式的节点代码的编码规则。这样的节点代码层次分明、一目了然,在进行实际的信息交换时,中间件能很好地实现这种代码与实际的IP地址之间的转换,比如,客户端在发送一个群发请求“BroadToNodeUsers('浙江#中国','一则消息')”时,中间件软件能自动根据节点代码'浙江#中国'确定其IP地址,然后将一个群发任务提交给它,让它来完成群发的任务。
而一个节点内的各个用户的代码(在整个网络中的全局代码),则是其本地帐号+@符号+所在节点的节点代码,比如,用户代码“zs@浙江#中国”表示'浙江#中国'节点内的'zs'这个用户,直观、易于理解记忆。
QuickBurro中间件为Delphi程序员实现了大部分的服务器端软件开发的工作(也许就剩下业务逻辑部件的编写还需要应用程序员来写),所有组网、连接维持、寻址、路由、数据交换等细节都实现了封装,对应用程序是透明的。这种应用开发模型(以数据库存取为例)如下图所示:
[图 请参见http://computer.mblogger.cn/wpy020327]
在这种模型下,应用程序员的主要精力放在解决应用问题上,远程相关的部分只需要掌握QBClient客户端开发组件包的使用即可,需要访问哪个节点的资源,只需指定“节点代码”,而不需要与IP地址、端口、协议等打交道。而业务逻辑部件的中间层挂接(节点中间件软件处)和客户端的远过程调用,既实现了由应用程序员参与对业务逻辑进行封装、也可扩充节点服务程序的功能。
TQBConnection是基础连接控件,建立的实例将作为后面15个控件实例的一个属性。TUserLogin是用于实现本地用户登陆的控件,因大部分的其它控件都是需要用户事先登陆的,因此,它也是相对基础性的控件。而其它14个控件都是功能性的控件,比较容易理解。
[图 请参见http://computer.mblogger.cn/wpy020327]
三层架构中,业务逻辑通常封装在中间层,以实现代码重用、提高开发效率与质量的目的。QuickBurro系统也支持这种机制,只是其实现的方法有别于微软的Com/DCom技术,插件的接口规范也就差别很大了。下面这个是QuickBurro系统所支持的插件的编写规范,一个模板文件,只需要改个Library名字,再将你的代码写到RemteProcess主过程即可。
// // ----------------------------------------------------------------------------------- // // 服务器端插件编写模板文件 wgz. 2006.12.--2008.8. // // ----------------------------------------------------------------------------------- // // // 导出函数原型: // // RemoteFunction: function(AdoConn: TAdoConnection; // InText: string; // InStream: TMemoryStream; // var OutText: string; // var OutStream: TMemoryStream): boolean; stdcall // // 其中入口参数: // // AdoConn:TAdoConnection对象的实例,是调用本模块的节点系统的数据库连接,注意用完后别断开 // InText:TString类型的变量,包含有向本类模块提供的所有简单类型参数,中间以#9字符分隔 // InStream:TStream对象的实例,包含可能存在的二进制类型的入口参数,若为nil,表示不存在 // // // 其中出口参数: // // OutText:本模块处理结束后得到的简单类型结果数据,若有多项,以#9分隔 // OutStream:本模块处理结束之后得到的二进制类型的结果,若不存在,返回nil // // ----------------------------------------------------------------------------------- // library RemoteModule; {你可以改一下名字}
uses sharemem, SysUtils, Classes, Windows, forms, graphics, AdoDB;
{$R *.RES}
const CAPTUREBLT = $40000000;
// // 主函数... function RemoteProcess(AdoConn: TAdoConnection; InText: string; InStream: TMemoryStream; var OutText: string; var OutStream: TMemoryStream): boolean; stdcall; begin // // ----------------------------这里开始写你的程序-----------------------------------------
// ----------------------------你的程序写到这里为止--------------------------------------- // // 返回成功代码... result:=true; end;
// // 向主程序提供的函数或过程的输出声明... exports RemoteProcess;
// // 初始化代码... begin // end.
作者Blog: http://computer.mblogger.cn/wpy020327
QQ: 779545524(樵夫)
Email: wpy020327@163.com
|