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;

  

posted @ 2020-12-17 12:36  delphi中间件  阅读(461)  评论(0编辑  收藏  举报