当前位置:网站首页>Delphi SOAP WebService 服务器端多个 SoapDataModule 实现相同的接口方法,接口继承
Delphi SOAP WebService 服务器端多个 SoapDataModule 实现相同的接口方法,接口继承
2022-07-04 20:34:00 【pcplayer】
场景
WebService 服务器端,为了方便代码管理,将不同的业务逻辑,分到不同的 TSoapDataModule 里面去。这样好对代码做模块化管理。
多个 TSoapDataModule 可能需要实现相同的接口方法,每个 TSoapDataModule 模块对该方法的实现代码可能不同(因为业务不同);最简单可能性是每个模块要检查的客户端访问权限不同。
那么,在客户端,因为是调用服务器端的不同接口的相同方法,如果给每个接口写一次方法调用,代码冗余。
解决办法
服务器端:服务器端的接口,默认(IDE 自动生成的代码)从 IAppServerSOAP 继承。
如果我要多个接口里面都有一个相同的方法(或函数),可以自己定义一个接口,从 IAppServerSOAP 继承。
务器端的所有接口,从一个父类接口继承。上述相同的接口方法,声明到这个父类接口里面。
如此一来,客户端只需要一个调用父类接口的方法,根据子类接口不同,实际调用到的服务器端的实现模块就不同。搞定!
以下代码测试通过。
代码 - 服务器端接口声明
IParientIntf = interface(IAppServerSOAP)
['{04E35D2B-4A63-45DE-98C0-AED830BB06B7}']
function Hello(const S: string): string; stdcall;
end;
//ISoapDM_A = interface(IAppServerSOAP)
ISoapDM_A = interface(IParientIntf)
['{4499D900-1856-4178-8D6E-617856DBE2BD}']
end;
//ISoapDM_B = interface(IAppServerSOAP)
ISoapDM_B = interface(IParientIntf)
['{9618B6D7-0826-47D7-AAF6-F7BB3D6F1CDE}']
end;服务器端,模块一的代码:
TSoapDM_A = class(TSoapDataModule, ISoapDM_A, IAppServerSOAP, IAppServer)
FDConnection1: TFDConnection;
FDQuery1: TFDQuery;
DataSetProvider1: TDataSetProvider;
DataSetProvider11111: TDataSetProvider;
private
public
function Hello(const S: string): string; stdcall;
end;
function TSoapDM_A.Hello(const S: string): string;
begin
Result := 'Hello, ' + S + '; This is SoapDM_AAAAA';
end;务器端,模块二的代码:
TSoapDM_B = class(TSoapDataModule, ISoapDM_B, IAppServerSOAP, IAppServer)
FDConnection1: TFDConnection;
FDQuery1: TFDQuery;
DataSetProvider1: TDataSetProvider;
DataSetProvider222222: TDataSetProvider;
private
public
function Hello(const S: string): string; stdcall;
end;
function TSoapDM_B.Hello(const S: string): string;
begin
Result := 'Hello, ' + S + '; This is SoapDM_B';
end;客户端代码:
procedure TForm3.DoHello(Intf: IParientIntf; const S: string);
var
S2: string;
begin
S2 := Intf.Hello(S);
ShowMessage(S2);
end;客户端调用服务器端模块一:
procedure TForm3.Button3Click(Sender: TObject);
begin
Self.DoHello(HttpRIO1 as ISoapDM_A, '你好');
end;客户端调用务器端模块二:
procedure TForm3.Button2Click(Sender: TObject);
begin
Self.DoHello(HttpRIO2 as ISoapDM_B, '深圳');
end;上述调用,在客户端需要注意的问题:
同一个 HTTPRIO1 调用了接口一,再去调用接口二,会出现 interface not support 的异常;反之亦然。采用同一个 HTTPRIO1 先后调用2个不同的接口该如何处理?暂时没看到有什么方法。
解决办法:多个 HttpRIO 实例,每个实例对应一个接口。
因此,上述代码里面,一个是 HttpRIO1 ; 另一个是 HttpRIO2;
总结
Delphi 的 WebService 框架中,服务器端由 IDE 自动创建的 TSoapDataModule 的子类模块,有它自己的接口声明。这个接口,继承自 IAppServerSOAP;
我们可以声明一个自己定义的接口,比如 IParientIntf = interface(IAppServerSOAP)
然后手动修改 IDE 创建的代码,把模块的接口的继承父类,改为 IParientIntf;
通过这样的方式,可以简化客户端的代码,无需对应每个模块,都实现一段相同的调用代码。
边栏推荐
猜你喜欢

【微信小程序】协同工作与发布

UTF encoding and character set in golang

B站视频 声音很小——解决办法

华为ensp模拟器 配置ACL访问控制列表

WGCNA analysis basic tutorial summary

Huawei ENSP simulator realizes communication security (switch)

A quick start to fastdfs takes you three minutes to upload and download files to the ECS

Can be displayed in CAD but not displayed in print

Huawei ENSP simulator configures DHCP for router

Redis:Redis配置文件相关配置、Redis的持久化
随机推荐
华为ensp模拟器 DNS服务器的配置
Jerry's ad series MIDI function description [chapter]
JS卡牌样式倒计时天数
[ 每周译Go ] 《How to Code in Go》系列文章上线了!!
colResizable.js自动调整表格宽度插件
五子棋 上班摸鱼工具 可局域网/人机
杰理之AD 系列 MIDI 功能说明【篇】
Day24: file system
Use of redis publish subscription
NetWare r7000 Merlin system virtual memory creation failed, prompting that the USB disk reading and writing speed does not meet the requirements. Solution, is it necessary to create virtual memory??
Jerry's ad series MIDI function description [chapter]
SolidWorks工程图添加材料明细表的操作
Redis transaction
2021 CCPC Harbin B. magical subsequence (thinking question)
UTF encoding and character set in golang
PS vertical English and digital text how to change direction (vertical display)
刘锦程荣获2022年度中国电商行业创新人物奖
Huawei ENSP simulator configures ACL access control list
基于OpenCV haarcascades的对象检测
Daily question-leetcode556-next larger element iii-string-double pointer-next_ permutation