Hallo Leute,
ich befasse mich gerade für ein Projekt mit WCF. Es geht, ganz grob, um folgendes:
Ich entwickle ein Prozessleitsystem. Das ganze soll auf einer Client-Server-Architektur basieren:
Der Server macht den Datenaustausch mit dem Steuerungssystem und bildet die dort befindlichen Objekte (z.B. Antriebssysteme, Temperaturregelungen, etc.) in einer Hashtable ab. Dabei ist jedes Objekt abgeleitet vom Basistyp "Gerät".
Wenn sich jetzt etwas tut (Motortemperatur steigt z.B.) so soll diese Änderung an einem Bedienpanel (Client) angezeigt werden.
Der Server sagt also beim Client bescheid "Hier hat sich am Objekt mit diesem und jenen Key was getan" und der Client ruft dann über WCF eine Methode des Service auf. Diese möchte ich aber offen gestalten. Ich würde also den Key übergeben und das zugehörige Objekt von der Methode zurückgegeben bekommen.
Hier ist der Haken: Ich müsste das Objekt als Typ "Gerät" zurückliefern. Dann hab ich allerdings ein Problem: Wenn es beim Client ankommt ist es wirklich nur noch ein Gerät, alle Informationen der abgeleiteten Klasse, z.B. "Motor" sind weg.
Was kann ich da tun? Oder ist mein Ansatz zu umständlich und es geht auch besser?
Vielen Dank schonmal im Voraus.
Ganz schnell, ohne groß nachzudenken würde ich sagen: liefere und speichere den Type mit! Dann kannst du auf Clientseite entsprechend casten.
Würde ich auch so machen, wobei ich nicht weiß ob WCF den "Type" Typ serialisieren kann. Falls nicht kannst Du auch den Type.FullName als string mitschicken und auf der Gegenseite per Reflection wieder anlegen.
"It is not wise to be wise" - Sun Tzu
Vielleicht verstehe ich das Problem nicht recht, aber es ist doch ohne weiteres möglich, den Rückgabetyp als zum Beispiel "Gerät" zu deklarieren, als tatsächlich übergebenen Typ aber eine Ableitung davon, sagen wir "Temperaturregelung".
Wichtig ist doch nur, dass das KnowTyp-Attribut angegeben wird, auf der Basisklasse, für jede abgeleitete Klasse.
Ich würde nicht Type.FullName mitschicken, sondern sogar Type.AssemblyQualifiedName
Wichtig ist doch nur, dass das KnowTyp-Attribut angegeben wird, auf der Basisklasse, für jede abgeleitete Klasse.
Okay, das ist natürlich auch 'ne Möglichkeit. Muss man halt nur kennen...