datasnap+msgpack
datasnap+msgpack
datasnap借助rtti,可以使用任何类型的自定义对象作为远程方法的参数和返回类型,这真是非常恐怖的存在。任何其他3方中间件是无论如何都做不到这一点的。
unit ServerMethodsUnit1; interface uses MsgPack, System.SysUtils, System.Classes, Datasnap.DSServer, Datasnap.DSAuth; type {$METHODINFO ON} TServerMethods1 = class(TComponent) private { Private declarations } public { Public declarations } function test(params: TMsgPack): TMsgPack; end; {$METHODINFO OFF} implementation uses System.StrUtils; { TServerMethods1 } function TServerMethods1.test(params: TMsgPack): TMsgPack; begin var f1: string := params.Force('f1').AsString; var f2: string := params.Force('f2').AsString; FreeAndNil(params); Result := TMsgPack.Create; Result.Force('result').AsBoolean := True; Result.Force('f1').AsString := f1; Result.Force('f2').AsString := f2; end;
type TServerMethods1Client = class(TDSAdminClient) private FtestCommand: TDBXCommand; public constructor Create(ADBXConnection: TDBXConnection); overload; constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload; destructor Destroy; override; function test(params: TMsgPack): TMsgPack; end;
procedure TForm2.Button1Click(Sender: TObject); begin var send: TMsgPack := TMsgPack.Create; send.Force('f1').AsString := '咏南'; send.Force('f2').AsString := '中间件'; var m: TServerMethods1Client := TServerMethods1Client.Create(SQLConnection1.DBXConnection); var recv: TMsgPack := m.test(send); if recv.Force('result').AsBoolean then begin Memo1.Lines.Add(recv.Force('f1').AsString); Memo1.Lines.Add(recv.Force('f2').AsString); end; m.Free; end;
本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/14148989.html