Laden...

Serveranwendung ruft Methode im Client per delegate auf

Erstellt von Inderrupt vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.333 Views
Thema geschlossen
I
Inderrupt Themenstarter:in
23 Beiträge seit 2014
vor 9 Jahren
Serveranwendung ruft Methode im Client per delegate auf

Hallo,

habe die Problematik bis jetzt so gelöst:

Der Client erstellt ein Remoteobject namens "server" und ruft eine Methode zur Initialisierung der Datenmember des Servers auf. Dabei übergebe ich ein Instanz "instanz" der Klasse(Der Clientanwenung), die die Methode beinhaltet. Bei der Initialisierung auf Serverebene wird ein delegate erzeugt und der Funktion des Objekts zugewiesen. Danach wird je nach bedarf die Funktion des Clients aufgerufen, indem der Server den namen der delegate instanz verwendet.

Ich soll allerdings die Methode vom CLient im Server aufrufen, ohne den Methodennamen zu wissen. Nach diesem Modell muss der Name ja bekannt sein, da ich dem delegate die Methode (instanz.funktionsnamen) zuweisen muss.

Also wollte ich das delegate im Client erstellen, der methode zuweisen und dann die delegate instanz als parameter an die Initialisierungsmethode des Servers übergeben. Der Server kennt dann den Namen der Methode nicht, ruft diese allerdings per delegate auf.

Obwohl es keine Fehlermeldung gibt beim kompelieren, scheint dies nicht zu funktionieren. Weiß jemand warum das sein könnte? Das delegate ist einer DLL hinterlegt, die in Server/Client eingbettet sind.

T
2.224 Beiträge seit 2008
vor 9 Jahren

Frage am Rande.
Was willst du genau damit erreichen?

Eigentlich sollte der Server nie den Client ansprechen.
Der Server sollte im Idealfall die gesamte Verarbeitung haben.
Der Client sollte dann nur die Daten fertig bekommen und nur noch präsentieren(anzeigen).

Ich würde bei deiner aktuellen Beschreibung von einer schlechten Architektur sprechen.
Den so wie du das ganze schilderst, klingt das auch nicht wirklich nach Client/Server Architektur.

Ein paar mehr Details zu dem fertigen Prozess wären hilfreich um dir eine bessere Lösung anzuzeigen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

N
135 Beiträge seit 2006
vor 9 Jahren

Die DLL, die der Server und der Client verwendet, verwendet nicht die gleichen Resourcen.
Selbst wenn du eine Klasse erstellst und in dieser ein Event zugewiesen wird, die Klasse dann irgendwie an den Server geschickt wird, kann der Server das Event nie auf dem Clienten auslösen.
Schau dir mal WCF an. Hier ist der Aufruf vom Server zum Clienten möglich, aber nur durch ein Interface welches die benötigten Callbacks definiert.

I
Inderrupt Themenstarter:in
23 Beiträge seit 2014
vor 9 Jahren

Ist leider so in der in der Aufgabenstellung vorgegeben. Ich denke es geht darum, dass die Methode (entspricht eienr Funktionsgleichung) im Client geändert werden kann, also für viele Gleichungen erfolgen kann, ohne im Server etwas ändern zu müssen.

Also ganz vereinfacht, soll ein Server eine Methode im Client via delegate aufrufen, deren Namen er nicht kennt. Mit der Übergabe des zugewiesenen delegates an den Server hat es leider nicht funktioniert.

Generell erfolgt die Benutzereingabe im Client, dieser schickt die Daten an den Server, der die Brecehnung auch mithilfe einer Methode im Client durchführt. Danach sendet er die Daten an den Client zurück, wo die Auswertung erfolgt.

N
135 Beiträge seit 2006
vor 9 Jahren

Ich kann mir im praktischen Umfeld keine Situation vorstellen die so etwasbenötigt.

Aber im Interface kannst Du auch ein Delegate definieren. Das geht evtl.

I
Inderrupt Themenstarter:in
23 Beiträge seit 2014
vor 9 Jahren

Im Interface darf man doch keine delegates definieren, doer habe ich das falsch verstanden?

16.842 Beiträge seit 2008
vor 9 Jahren

Versteh ich das richtig, dass Du dem Server eine komplette Methode mit Ausführungsinhalt übergeben willst, alá Script?
Sprich im Client definierst Du eine Methode und auf dem Server soll die ausgeführt werden?

Sowas funktioniert (Gott sei dank) nicht, nicht mal als Delegate.

I
Inderrupt Themenstarter:in
23 Beiträge seit 2014
vor 9 Jahren

Ich zitiere mal die Aufgabenstellung, vielleicht versteh ich da ja etwas falsch:

"Definieren Sie die Funktionen y'¢ in der Client-Assembly. Nutzen Sie das Delegate zum Aufruf der Funktionen vom Server"

Und das ist nicht möglich?

16.842 Beiträge seit 2008
vor 9 Jahren

Die Ausdrucksweise der Frage lässt viel Spielraum.

Du kannst sagen:
"Server, Du kennst Methode "Execute". Führ sie mit folgenden Parametern aus aus."
So funktioniert jede API, egal ob SOAP, REST und wie sie alle heißen.

Aber Du kannst nicht sagen:
"Hey Server, führ folgendes aus: public void Method.....".

I
Inderrupt Themenstarter:in
23 Beiträge seit 2014
vor 9 Jahren

Also in dem Zusammenhang fiel die Aussage, dass der Server eine für ihn unbekante Methode (Namen) aufruft. Dadurch wird es doch konkreter oder?

16.842 Beiträge seit 2008
vor 9 Jahren

Wenn es prinzipiell eine bekannte Methode ist, aber nur der Name übergeben werden soll; das geht wie gesagt (Invoke).
Aber eine komplette Methodensignatur mit Body und Co: das geht nicht.

I
Inderrupt Themenstarter:in
23 Beiträge seit 2014
vor 9 Jahren

Letztendlich soll der Server die Methode im Client aufrufen, ohne dass der Methodennamen explizit im Server deklariert werden muss. Bis jetzt habe ich es nur so gelöst, dass ich das Object der Klasse, die diese Methode definiert an den Server übergebe. Und dort ein delegate erstellt wird, dass mit der Methode des Objects zugeweisen wird. Da muss ich ja allerdings den Namen der Methode wissen (delegatetype name = new delegatetyp(object.methodenname)).
Ich verstehe nicht wie ich den Methodennamen übergeben soll...

P
1.090 Beiträge seit 2011
vor 9 Jahren

Hi ich denke Server und Client sind, haben hier ein wenig für Verwirrung gesorgt.

Wenn ich es richtig verstanden habe erzeugt der Client ein RemoteObjekt namens Server.
Der Server kann, natürlich ein Event (Delegate) bereitstellen, was der Client Abonniert.
Schau dir mal Remote Objects Part 1 an.

Ansonsten mal nach Remote Objekts und Events googlen.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

I
Inderrupt Themenstarter:in
23 Beiträge seit 2014
vor 9 Jahren

Ja genau, ich erzeuge ein RemoteObject , sorry dass es zur Verwirrung kam, ich kenne mich mit dem Thema nicht so gut aus. Ich werd mir das mal anschauen. Das delegate im Client zu definieren und an die Serveranwendung zu schicken hat nciht funktioniert.

P
1.090 Beiträge seit 2011
vor 9 Jahren

Der Server soll auch auch den delegate (Methoden Zeiger) bereitstellen, den der Client dann abonniert. Ein Zeiger vom Server auf die Methode des Clients. Dann kann der Server auch die Methode aufrufen.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

I
Inderrupt Themenstarter:in
23 Beiträge seit 2014
vor 9 Jahren

Verstehe ich das nun richtig:

Ich definiere ein Event im Serverprozess mit passendem delegate (gleicher typ wie die Methode die im Client definiert ist). Ich erzeuge ein remote Object der Serverklasse im Client. Dann weiße ich der Methode im Client das Event zu. Und schließlich wird das Event an passender stelle im Serverprozess aufgerufen.

Danke schonmal für eure Hilfe!

P
1.090 Beiträge seit 2011
vor 9 Jahren

Grundlegend schon.

Nur das Evenst ein spezial Fall eines Delegate ist. Also alle Events sind Delegates, aber nicht alle Delegates Events. Was passen muss ist die Signatur der Methode. Das sind aber Grunlagen, die man sich ergooglen kann.

MFG
Björn

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

Hinweis von herbivore vor 9 Jahren

Damit sollte dann wirklich alles gesagt sein. Der Thread lang genug und hat sich oft genug im Kreis gedreht.

Thema geschlossen