|
《关于VisiBroker For Delphi的使用》
-CORBA技术实践(一)
宜昌市中心人民医院 赵普昉
email: 3boy@sohu.com
4、实例设计与分析
上一次我想大家介绍了一个在CORBA中使用Pooler的小程序,这段代码中使用了较为高级的编写方法,在分析这个实例之前,我想和大家谈一点设计工具的应用,当然我会在本文的后续文章中深入探讨关于这些辅助手段的应用,在这里我只想简要的描述一下,为正真的工程项目中实现CORBA技术做好相应的知识储备。
前面我介绍了接口描述语言(IDL)的一些较为基础语言要素,如果只是在Delphi中开发实际的基于VisiBroker 的ORB多层应用体系的基本应用可以大胆的说已经够用了(如果有人反对我不介意),CORBA是一一个不断补充发展的标准,而且每种ORB产品又会对CORBA进行自己的描述,所以前面的一些IDL只是有一部分和OMG的定义有一定的区别,但是这不会影响到我们理解CORBA,当然必须说明的是前面的IDL描述都是完全符合VisiBroker的规范的。在C/S模式的程序设计之中,我们中绝大部分人是不会去考虑接口设计的,偶尔的出现也不会是采用我们开发多层系统这样的模式,所以刚刚接触多层系统的程序员要付出比C/S模式下设计大的多地精力来设计它,而且会拖延开发的周期,我一直在思考一个问题能不能避免这样的事情呢?或者说去谋求一个好的方法来改进我们的设计呢?在我看来拖延工期的问题主要表现在我们对于接口的确定上,接口的不确定因素体现在增加接口,修改接口,废止接口等等诸多问题上,设计接口我觉的类似与我们在设计ER图中的实体间的关系一样,如何平衡【服务――-中介―――客户】三者之间的关系是多层的首要问题,也是使得我们反复的罪魁祸首,在这里我想向大家推荐强大的Rational家族系列产品(Rose,SODA,ClearCase…..)我们可以使用这样的一些辅助工具来缩短我们的反复频率,在问题的分解中明确接口的设计方向与设计原则,对于拥有微软企业版开发套间的朋友可以利用Virtual Moduler工具来设计(这个工具是微软捆绑的ROSE产品,是一个标准的多层体系)在这里我不对如何使用他们来设计CORBA的接口进行描述,原因只有一个这是一个高级课题不属于<VisiBroker for Delphi>的范畴之中,我会在《面向CORBA的设计实践》中与大家共同探讨。
好了闲话就聊到这里,下面开始正体。
记得我在本文的第一小节中提到过CORBA DataMoudel Object,如果使用过这个对象的朋友一定清楚的了解单线程模式与多线程模式,也就是CORBA 3.3为大家提供了两种来至于TDataMoudel对象,进行的整体的封装,然而现在的CRB4.0为程序员提供了更大的灵活性
让我们自己来编写这样的两种不同的对象,显然后者可以让我们更广泛的扩展应用面,上次的例程就是一个多线程模式的例子,在讲解多线程模式之前我想还是让我们来看一下单线层模式的实例:
/*IDL*/
module TypeLibCRB
{
interface InterfaceCRB;
interface InterfaceCRB
{
any GetSQLData(in wstring Script, in boolean ExecutOrActive);
};
//定义一个发送客户执行的SQL,返回一个any类型
};
//XXX_Impl.pas
interface
uses
SysUtils,
CORBA,
TypeLibCRB_i,
TypeLibCRB_c
;
type
TInterfaceCRB = class;
TInterfaceCRB = class(TInterfacedObject, TypeLibCRB_i.InterfaceCRB)
protected
public
constructor Create;
function GetSQLData ( const Script : WideString;
const ExecutOrActive : Boolean): Any;
end;
implementation
uses UmCRBServer, UnCRBServer;
constructor TInterfaceCRB.Create;
begin
inherited;
end;
function TInterfaceCRB.GetSQLData ( const Script : WideString;
const ExecutOrActive : Boolean): Any;
begin
Form1.Memo1.Lines.Text:=Script;
Result:=DataMCRB.GetData(Script,ExecutOrActive);
//调用TDataMoudel实例的方法请注意这个地方只有一个TDataMoudel实例
//下面的程序中会描述这个实例的方法定义
end;
initialization
end.
/********************/
/*动态创建数据实例的操作*/
unit UmCRBServer;
interface
uses
SysUtils, Classes, DB, DBTables,Provider;
type
TDataMCRB = class(TDataModule)
DatabCRB: TDatabase;
QueryCRB: TQuery;
DataSetPCRB: TDataSetProvider;
private
{ Private declarations }
public
function GetData(Script:String;ExecuteOrActicve:boolean):OleVariant; { Public declarations }
end;
var
DataMCRB: TDataMCRB;
function RunSQL(QueryX:TQuery;Script:String;ExecuteOrActive:boolean):boolean;
implementation
//这个代码中没有使用Session,也没有对事务进行控制,下一章节会给出一个使用Session的//例程,想一想这个方法的应用会有什么有点和缺点,如果愿意谈一谈請将您的想法发往我得//信箱
{$R *.dfm}
function RunSQL(QueryX:TQuery;Script:String;ExecuteOrActive:boolean):boolean;
begin
Result:=false;
with QueryX do
begin
if Active then Active:=false;
SQL.Clear;
SQL.Text:=Script;
if ExecuteOrActive then
ExecSQL else
Active:=true;
if not IsEmpty then
Result:=true;
end;
end;
//这段代码我不讲解
{ TDataMCRB }
function TDataMCRB.GetData(Script: String;
ExecuteOrActicve: boolean):OleVariant;
var
MyQry:TQuery;
MyPrv:TDataSetProvider;
begin
try
MyQry:=TQuery.Create(self);
MyPrv:=TDataSetProvider.Create(self);
MyQry.DatabaseName:=DatabCRB.DatabaseName;
//注意如果使用TDataBase对象請将ShareHandle设为True;
MyPrv.DataSet:=MyQry;
if RunSQL(MyQry,Script,ExecuteOrActicve) then
Result:=MyPrv.DATA;
finally
MyQry.Free;
MyQry:=nil;
MyPrv.Free;
MyPrv:=nil;
end;
end;
//动态创建数据集和数据提供者对象,在调用接口将数据返回给Client后释放动态创建的两//对象。这样可以避免在单线模式下客户端持久的拥有接口后的对象。
end.
/*****************************************/
/初始化CORBA实例,主单元
unit UnCRBServer;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Corba, TypeLibCRB_c, TypeLibCRB_i, TypeLibCRB_impl, Type [1] [2] [3] 下一页 [系统软件]InstallShield Express for delphi制作安装程序定… [系统软件](转帖) 忘记登录密码的解决方案 for XP/2003/2000 [系统软件]交叉编译sshd for IXP425 ARM Platform by MVL 3… [Delphi程序]一个超链接Image控件!(For D3,D4,D5,D6)源代码 [Delphi程序]Five of the best tools for Delphi [Delphi程序]《关于VisiBroker For Delphi的使用》(3) [Delphi程序]《关于VisiBroker For Delphi的使用》(2) [Delphi程序]《关于VisiBroker For Delphi的使用》 [Delphi程序]Delphi for .Net 编译器预览 - by John Kaster [Delphi程序]编写一个单独的Web Service for Delphi7(步骤)
|