![]() |
Delphi-Version: 10 Berlin
Wrapper für SOAP Aufrufe gesucht
Ich habe da ein kleines "Problem" Ich habe zur Kommunikation mit einem SOAP Server ca. 15 Methoden, die die eigentlichen SOAP-Calls die der Delphi-WSDL Assistent erzeugt aufruft. Da das multithreaded und auch plattformübergreifend gehen muss sehen diese Methoden weitgehend gleich aufgeblasen aus:
Delphi-Quellcode:
Es ergeben sich bei den Methoden nur marginale Unterschiede im als Individuell markierten Bereich. Ich habe nach einer langen Woche nur noch Bretter vor dem Kopf und komme nicht darauf, wie ich das 15 fache
function TKommunikation.SendShutDown(aShutDownType: Integer): Boolean;
var ServerPort: DevicePortType; // aus automatisch erzeugten SOAP.pas begin Result := False; {$IFDEF MSWINDOWS} CoInitialize(nil); {$ENDIF MSWINDOWS} ServerPort := GetDevicePortType(False, fConfig.SoapServerAdress); if fConnectionOK then begin // Individuelles von hier Result := ServerPort.Shutdown(aShutDownType) = 'Done'; // bis hier end; {$IFDEF MSWINDOWS} CoUninitialize; {$ENDIF MSWINDOWS} end;
Delphi-Quellcode:
nur noch einmal brauche. Ich hatte mich bis eben daran versucht den eigentlichen SOAP-Call als Parameter an eine einzelne Methode zu übergeben, die dann das ganze Brimborium drumherum klatscht. Aber das scheiterte an meinen Gehirnwindungen...bin ich auf dem Holzweg?
var
ServerPort: DevicePortType; // aus automatisch erzeugten SOAP.pas begin Result := False; {$IFDEF MSWINDOWS} CoInitialize(nil); {$ENDIF MSWINDOWS} ServerPort := GetDevicePortType(False, fConfig.SoapServerAdress);
Delphi-Quellcode:
Ist das ein falscher Ansatz? Geht es anders leichter oder besser?
function TKommunikation.SOAPComWrapper(aFunc: TFunc<Integer, Boolean>): Boolean;
var ServerPort: DevicePortType; // aus automatisch erzeugten SOAP.pas begin Result := False; {$IFDEF MSWINDOWS} CoInitialize(nil); {$ENDIF MSWINDOWS} ServerPort := GetDevicePortType(False, fConfig.SoapServerAdress); if fConnectionOK then begin Result := aFunc; // Das mag der Compiler nicht, es fehlen ja Parameter, aber die sollen // ja mit übergeben werden dachte ich... end; {$IFDEF MSWINDOWS} CoUninitialize; {$ENDIF MSWINDOWS} end; Sherlock |
AW: Wrapper für SOAP Aufrufe gesucht
Wie wäre es mit einer Property vom Typ des Interfaces und Lazy Initialization?
Delphi-Quellcode:
type
TKommunikation = class private FServerPort: DevicePortType; function GetServerPort: DevicePortType; public property ServerPort: DevicePortType read GetServerPort; end; function TKommunikation.GetServerPort: DevicePortType; begin if not Assigned(FServerPort) then begin {$IFDEF MSWINDOWS} CoInitialize(nil); {$ENDIF MSWINDOWS} FServerPort := GetDevicePortType(False, fConfig.SoapServerAdress); end; Result := FServerPort; end; |
AW: Wrapper für SOAP Aufrufe gesucht
Delphi-Quellcode:
Das wäre eine Möglichkeit
function TKommunikation.SOAPComWrapper(aFunc: TFunc<Integer, Boolean>; intparam : integer; boolparam : boolean): Boolean;
var ServerPort: DevicePortType; // aus automatisch erzeugten SOAP.pas begin Result := False; {$IFDEF MSWINDOWS} CoInitialize(nil); {$ENDIF MSWINDOWS} ServerPort := GetDevicePortType(False, fConfig.SoapServerAdress); if fConnectionOK then begin Result := aFunc(intparam, boolparam); // Das mag der Compiler nicht, es fehlen ja Parameter, aber die sollen // ja mit übergeben werden dachte ich... end; {$IFDEF MSWINDOWS} CoUninitialize; {$ENDIF MSWINDOWS} end; |
AW: Wrapper für SOAP Aufrufe gesucht
Die andere Möglichkeit :
Delphi-Quellcode:
TSoapCall = reference to function (): boolean ;
function TMyClass.SOAPComWrapper(aFunc: TSoapCall): Boolean; var ServerPort: DevicePortType; // aus automatisch erzeugten SOAP.pas begin Result := False; {$IFDEF MSWINDOWS} CoInitialize(nil); {$ENDIF MSWINDOWS} ServerPort := GetDevicePortType(False, fConfig.SoapServerAdress); if fConnectionOK then begin Result := aFunc(); // Das mag der Compiler end; {$IFDEF MSWINDOWS} CoUninitialize; {$ENDIF MSWINDOWS} end; // Aufrufen if SOAPComWrapper(function() : boolean begin result := myCall(1, false); // Hie den gewünschten Aufruf end ) then; |
AW: Wrapper für SOAP Aufrufe gesucht
Oha! Das werde ich ausprobieren! Aber erst geh ich ins Wochenende ;)
Montag berichte ich dann. Danke für die Hinweise! Sherlock |
AW: Wrapper für SOAP Aufrufe gesucht
Jaaa, das geht so nicht ganz. Weil, die gewrappte Methode ja eine Methode des ServerPort ist. Und ServerPort wird erst im Wrapper erzeugt.
Vermutlich lass ich den Code dann halt so aufgepustet... Sherlock |
AW: Wrapper für SOAP Aufrufe gesucht
Hmm..
Oder mach es so:
Delphi-Quellcode:
mit deiner Funtion für z.B. Shutdown:
type
TSOAPFunc = function( ServerPort: DevicePortType):boolean; function TKommunikation.SOAPComWrapper(aFunc: TSOAPFunc): Boolean; var ServerPort: DevicePortType; // aus automatisch erzeugten SOAP.pas begin Result := False; {$IFDEF MSWINDOWS} CoInitialize(nil); {$ENDIF MSWINDOWS} ServerPort := GetDevicePortType(False, fConfig.SoapServerAdress); if fConnectionOK then begin Result := aFunc(ServerPort); // mit übergeben wird der ServerPort end; {$IFDEF MSWINDOWS} CoUninitialize; {$ENDIF MSWINDOWS} end;
Delphi-Quellcode:
AUfruf mit:
function ServerShutdown(aServerPort: DevicePortType):boolean;
begin Result := aServerPort.Shutdown(aShutDownType) = 'Done'; end; // Aufrufen
Delphi-Quellcode:
if SOAPComWrapper(ServerShutdown) then ...;
|
AW: Wrapper für SOAP Aufrufe gesucht
Oder Du holst Dir über eine Class-Function ein Interface und setz CoInit und im Destructor der Interface-classe den CoUnInit.
Dann noch eine Procedure mit übergeben und schon hast Du alles was Du brauchst.
Delphi-Quellcode:
Mavarik
Procedure MyWebAufruf;
begin SOAP.Call( // SOAP gibt ein IInterface zurück Procedure begin // Whatever end); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz