Laden...

.NET Remoting + By-value

Erstellt von typhos vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.310 Views
T
typhos Themenstarter:in
243 Beiträge seit 2006
vor 17 Jahren
.NET Remoting + By-value

Hallo,
ich beschäftige mich erst seit ein paar Tagen mit .NET Remoting und ich habe dabei ein Problem bzw. eine Frage:

Bei der Übergabe der Objekte vom Server/Host zum Client by value werden die Objekte ja kopiert.
Damit die Klassen auf dem Client instanziert werden können, muss das Assambly, welches die Klassen enthält, auch beim Client eingebunden werden. Woher weiß ich denn, dass wirklich ein Objekt vom Server erzuegt und auf den Client kopiert wird, wenn ich dort ein neues Objekt instanziere? Der Typ ist natürlich vorher mit RegisterActivatedClientType als Remote-Objekt registriert worden!

Dann frage ich mich noch folgendes: Nehmen wir an, wir haben auf dem Server eine Assambly mit der Geschäftslogik - zum Beispiel wird in einer Methode etwas aus einer Datenbank gelesen und als DataSet zurückgegeben. Wenn aber die Klasse der Geschäftslogik auf dem Client instanziert wird (wo natürlich keine Datenbank vorhanden ist - es soll ja eigentlich auch die Datenbankabfrage auf dem Server passieren), funktioniert das dann?
Oder ist die Übergabe der Objekte by value in dem Fall gar nicht möglich? Was sind überhaupt die Vor- und Nachteile von einer by-value-Übertragung?

Ich hoffe, jemand versteht meinen Text - kann mich momentan leider nicht besser ausdrücken!!
Vielen Dank schonmal im Voraus!

L
254 Beiträge seit 2005
vor 17 Jahren

Ich versuch mich mal;

Das was du meinst mit Funktion oder Objekt "ByVal" instanzieren und was machen dürfte in der tat nicht gehen, da deine Assembly nicht auf m Server ist (und die Funktionen fehlschlagen).

So wie ichs verstehe, müsstest du dieses Object ByRef verwenden (dann manipulierst du tatsächlich das Objekt auf dem Server das dort auch das machen kann was es soll - DB ändern oder so-)

ByVal ist eher für Objekte gedacht, die Infos enthalten und beschreiben. Du hast dann ne "Byref Methode in ner Byref Klasse die n Byval Parameter zurückgibt oder als pyval Inputparameter erwartet)

Vor und Nachteil kannste nicht direkt sagen, beide Techniken haben an gewissen Orten ihr Einsatzgebiet (Ihre spez. vor und nachteile).

Also wenn du ne Liste an Daten von deinem Server zurückbekommst und du manipulierst diese Liste (egal was da drin steht), so würde das byref bedeuten das die Liste ständig mit dem Server abgeglichen wird (obwohl du das nicht willst). Weil die Liste von dir aufbereitet und manipuliert wird, und du sie dann am schluss wenn sie fertig ist zum Server überträgst. Dieser Macht dann irgendwas, abhängig davon was drin steht.

Hier wäre byref einfach das falsche....

Ich hoffe ich erzähl keinen Mist und habe dir wenigstens ein wenig geholfen !? 🙂

If you can't make it, fake it.

T
typhos Themenstarter:in
243 Beiträge seit 2006
vor 17 Jahren

Danke für die Antwort.

Lass mich das etwas eingrenzen:
Sagen wir, ich habe eine Klasse, in der verschiedene Methoden sind - davon einige, die nur irgendwas berechnen, und andere, die Daten aus einer Datenbank holen. Natürlich soll die Klasse auf dem Server vorhanden sein und die Datenbankabfragen müssen auch dort getätigt werden.
Der Client soll am besten nicht die Klassenimplementation kennen, sondern (wenn es geht) nur ein Interface. Weiterhin soll der Client die Klasse, die auf dem Server liegt, instanzieren und damit arbeiten können. Wenn ich dich richtig verstanden habe, funktioniert das nur byRef, da ja auf dem Client keine Datenbank ist. Die Methoden, die ausschließlich aus irgendwelchen Inputparametern irgendetwas berechnen, sollten aber (wenn möglich) auf dem Client ausgeführt werden, um den Server (bei vielen Clients) nicht zu stark zu belasten.

Wie muss ich dabei vorgehen? Ist das überhaupt so möglich?

4.506 Beiträge seit 2004
vor 17 Jahren

Hallo zusammen,

im Zusammenhang mit Remoting kenne ich kein "ByValue". Meiner Kenntnis nach gibt es genau 4 verschiedene Modi:
*- Server Side Activated object (Singleton) *- Server Side Activated Object (By Call) *- Client Side Activated object (Singleton) *- Client Side Activated object (By Call)

Und hier dann etwas Beschreibung dazu:

Server Side Activated bedeutet, dass das Objekt im Speicher des Servers aufgebaut und gehalten wird. Bei jeder Anfrage oder Änderung des Objektes werden die Anfragen/Änderungen an den Server geschickt, und der antwortet darauf. Singelton und By Call unterscheiden sich dadurch, ob alle Clients nun auf das selbe Objekt zugreifen, oder ob jeder Client sein eigenes Objekt erhält, mit dem er arbeiten kann. Wichtig ist, dass alles auf dem Server läuft.

Client Side Activated bedeutet, dass das Objekt auf Clientseite im Speicher aufgebaut und gehalten wird. Damit aber auch hier ein Singleton möglich ist, werden Anfragen und Änderungen auch an den Server geschickt, dieser leitet aber an entsprechenden Client weiter, dass dieser die Anfragen und Änderungen bearbeitet. Hier ist wichtig, dass das Ganze auf dem Client läuft.

Somit würde sich auch Deine Frage klären, was denn passiert, wenn die Geschäftslogik auf dem Client läuft, bzw. was passiert wenn sie auf dem Server läuft.

Mir fällt kein toller Sinn ein, warum es ClientSide Singletons geben sollte, aber auf Serverseite macht das durchaus Sinn. In Deinem, und in den meisten Fällen, macht es Sinn Geschäftslogik als Singleton auf dem Server laufen zu lassen.

Meist macht es dann auch Sinn auf dem Server mit einem Factory-Design-Pattern zu arbeiten, denn dann braucht der Server nur eine Klasse per Remoting anzubieten.

Probleme, auf die man hierbei stoßen könnte, wäre z.B. alle Klassen, die über die Factory an den Client geschickt werden müssen, müssen auch von MarshalByRef abgeleitet sein, und das wäre z.B. für Gui-Klassen (Windows.Form) nicht ohne weiteres möglich...

Ich hoffe, dass ich jetzt nicht zu viel Mist erzählt habe, und dass ich Dir helfen konnte.

Gruß
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

T
typhos Themenstarter:in
243 Beiträge seit 2006
vor 17 Jahren

Ja, OK. Ich habe nun eine kleine Remote-Anwendung erstellt (sehr klein und einfach). Nun drängt sich mir die nächste Frage auf:

Wenn ich SingleCall verwende, wird ja für jeden Methodenaufruf eine neue Instanz auf dem Server erzeugt und nach dem Aufruf wieder beendet.

Wie werden denn standardmäßig die Ergebnisse der Mothoden an den Client übertragen? Ich weiß, dass man das steuern kann, indem man als Rückgabeparameter Objekte verwendet, die von MarshalByRefObject abgeleitet sind (für eine Übertragung per Referenz) bzw. die das [Serializable]-Attribut bekommen (für eine Übertragung by value).
Aber wie werden die Objekte übertragen, wenn ich nichts mache, also standardmäßig?

Ich schätze mal, einfache Datentypen (string, int, float etc.) werden sowieso per Value übertragen, oder? Wie sieht es mit Objekten von DataSet oder DataTable aus? Werden die per Referenz übertragen? Wenn ja, kann ich mir selbst eine Klasse erstellen, die von z.B. DataTable abgeleitet ist und das [Serializable]-Attribut bekommt, um einen DataTabel by value zu übertragen?

Danke für eure Hilfe!! 👍

S
8.746 Beiträge seit 2005
vor 17 Jahren

Original von typhos
Aber wie werden die Objekte übertragen, wenn ich nichts mache, also standardmäßig?

Ganz einfach, du bekommst eine Exception (vermutlich schon bei der Proxy-Erzeugung). Entweder Serializable oder MarshalByRefObj. Alle Basistyen sind Serializable.

Z.B. String:

 
[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public sealed class String : IComparable, ICloneable, IConvertible, 
	IComparable<string>, IEnumerable<string>, IEnumerable, 
	IEquatable<string>

oder int

 
[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public struct Int32 : IComparable, IFormattable, IConvertible, 
	IComparable<int>, IEquatable<int>

T
typhos Themenstarter:in
243 Beiträge seit 2006
vor 17 Jahren

Danke. Das hat mir weitergeholfen. Also muss ich das bei eigenen Objekten immer selbst festlegen. Bei vorhandenen aus der Klassenbibliothek kann ich ja einfach nachschauen, ob sie by value oder reference übertragen werden!

Wirklich tolles Forum hier!

S
8.746 Beiträge seit 2005
vor 17 Jahren

Richtig. Spannend ist natürlich: Was ist wenn Objekte einer Klasse einmal by-value und einmal by-ref übertragen werden sollen.... ich kann mich entsinnen, dass das schonmal Thema hier war. Ist aber schon ein paar Monate her. In der Praxis wohl auch selten relevant.