关于三层结构开发中接口参数的问题!(50分)

  • 主题发起人 主题发起人 feidian
  • 开始时间 开始时间
F

feidian

Unregistered / Unconfirmed
GUEST, unregistred user!
一个比较初级的问题,但是最好的方案需要大家讨论得出.
在三层开发中,表示层和事务层要通讯,但是通讯接口的参数怎么设置比较好?
比如:操作人员在表示层输入了一个客户的基本信息,假设有20个字段(名称,
性别......什么的),调用的事务层的保存人员方法(接口),这个方法的参数
怎么写?我想到的有如下四个方法,大家讨论以下那个好,或者都不好:
1、用20个参数,分别表示每个字段
2、用xml当作参数,表示层传递这个XML.xml属性给事务层
3、表示层和事务层都定义相同的“客户”类,在接口中用对象当参数
4、自己写通讯函数,定义自己的协议

[red]欢迎大家讨论![/red][?]
 
高深,关注
 
在应用层定义一个接口
function TRemDataModal.Callproc(const procname: WideString;
paranum: OleVariant): OleVariant;
客户端通过应用层的接口来传递参数。
继续关注。。。。
 
IT书生:
这个方法有点意思!
你的意思是不是用这个方法作为主调函数去掉用应用层别的方法?而他只用接受数据?
 
[:D]通过 OleVariant创建一个字段数组来传递所有的参数[8D]
[:D]Type Library中新建一个方法,该方法具有一个类型为OleVariant的参数,
客户端调用OleArray数组创建字段数组,然后调用服务器端的过程,将参数传递
即可,不过此种方法要注意数组的顺序。[8D]
 
我看你是多虑了。直接使用ApplyUpdates不行吗?(ClientDataset有,DataSetProvider也有)
以OleVariant来传递数据,虽然成本大,但很方便有效。
如果你想自己写过程来更新数据的话,Variant数组也是唯一合理的选择。
因为你的数据可能有多种类型。
所以说,建议不用任何参数或自定义过程。
 
补充一下,我写的方法在实际应用中是用来调用存贮过程的,因为数据的类型,与参数的个
数都不固定,如果不需要这样,则可以参考其它方法。
 
我知道variant是很方便的。
但是 方法3 怎么实现不知道,谢谢转告?
3、表示层和事务层都定义相同的“客户”类,在接口中用对象当参数
 
其实用什么方法不重要,关键是运行效率以及在两层中要统一约定(协议)
建议用n个参数的形式和IleVariant参数形式。
xml冗余数据太多
 
3.用接口导出相应的类,传递接口,然后在客户端取得接口和即可使用相应的方法和属性。
或者用SOAP
 
3.用接口导出相应的类,传递接口,然后在客户端取得接口和即可使用相应的方法和属性。
好象不是这样的?
这样接口不是有很多吗?我的意思是可以直接传送,客户端取得_tlb即可使用。
 
我的做法:
3。用接口。
主辅表结构的辅表数据通过ClientDataSet.DataSet传递。
多交流。
 
3.我的理解对吗?
比如 定义一个人的对象
自然包含一些方法.一些属性可以缺省取值, 一些要通过接口操作数值

这样我们就可以传递了!实际上只是调用一些方法。 而这个对象也是抽象存在的!
或许更像一个约定。
 
这个问题快1年了啊。
不用传递这么多参数,简单的可以传递OleVariant型数组。
如:
var TextArray:OleVariant;
TextArray:=VarArrayCreate([0,19],varVariant);//定义20个字段
TextArray[0]:=.....
TextArray[1]:=.....
...........
//调用服务端方法
.....AppSever.XXXXX(TextArray);
//---->此处把数组传递过去
如果服务端还需要将个别参数传递给存储过程,这样也很方便。
 
一个参数就好了。
客户端
var ParamVarArray : Variant;
i:Integer;
begin
i:=3
ParamVarArray := VarArrayCreate([1,2,1,i,varVariant);
//i为参数个数
ParamVarArray[1,1]:= ParamName1;
ParamVarArray[2,1]:= ParamValue1;
ParamVarArray[1,2]:= ParamName2;
ParamVarArray[2,2]:= ParamValue2;
ParamVarArray[1,3]:= ParamName3;
ParamVarArray[2,3]:= ParamValue3;
DbModule.SaveInfo(ParamVararray);
end;

function TDbModule.SaveInfo(Params:OleVariant);
begin
XXXConnection.Open;
XXXConnection.AppServer.SaveInfo(Params);
...
end;

服务端
类型库中的Params参数类型为VARIANT
procedure TRmtDbModule.SaveInfo(Params: OleVariant);
var i:Integer;
begin
for i:=VarArrayLowBound(Params,2) to VarArrayHighBound(Params,2)do
begin
ParamName1 := Params[1,i];
ParamValue1 := Params[2,i];
... ...
end;

如果你的参数没有名字,只有顺序,则使用VarArrayCreate建立一维数据就可以了。
其实只是两边的约定,怎么做,全在你自己的想法的。
 
后退
顶部