[WCF] Per-Call versus Transaktionen/Unit of Work...
-
Vielleicht habe ich auch grundlegende Verständnisprobleme, aber ich versuche mal das Szenario zu beschreiben:
Ich habe immer gehört das man nach Möglichkeit WCF immer "Per-Call" verwenden sollte (Alternativen: Per Session & Single), nun frage ich mich aber wie die Best-Practice in folgenden Fall ist (aus Sicht der Oberfläche)
Gegeben ist ein typisches Eingabefenster aus einer Unternehmensanwendung, das über die ebenso typischen Speichern- und Abbrechen-Schaltflächen beendet werden kann. Ja, in der Theorie klappt hier "Per-Call" auch ganz gut, Ein Datensatz wird bearbeitet und z.B. als Datentransferobjekt über einen Aufruf an den Server geschickt...
...nur leider ist die Realität meist nicht ganz so einfach, spätestens wenn man in den Bereich komplexerer Anwendungen kommt. Da werden Daten teilweise aus vielen Tabellen zusammengesetzt, und dies kann ggf. sogar recht dynamisch erfolgen (im Extremfall per Plugin-System, das beispielsweise Tabs in ein Fenster ergänzt, mit Eingabedaten die ursprünglich nicht vorgesehen waren).
Beispiel: Eine komplexere Adressverwaltung lässt zu das Adressen mehrere Rollen wie Kunden, Lieferanten usw. einnehmen können. Diese Rollen haben zusätzliche Daten die über die eigentliche Adresse hinaus gehen, und über die Id des Adressdatensatzes in der Datenbank miteinander verbunden werden. Idealerweise sollten weitere Daten auch ergänzt werden, ohne immer das Fenster anzupassen und somit über eine Form von Pluginschnittstelle dazu kommen.
Nun scheint es nach meinem Verständnis mehrere Lösungsansätze mit unterschiedlichen Vorteilen zu geben:
Variante a: Man verzichtet auf einen Teil der Flexibilität und besagt das alle möglichen "Zusatzdaten" von einem Typ vererbt werden, und die verwendeten Typen dem zugrundeliegenden Datentransferobjekt in einer Collection hinzugefügt werden. Dies bedeutet aber auch, das dem DataContract an dieser Stelle mit dem "KnownType"-Attribut alle Typen bekannt gemacht werden müssen. Im Gegenzug kann man wieder über einen Aufruf die Daten als ganzes an den Server geben (Was nach meinem Verständnis Per-Call zulässt).
Variante b: Man sagt das jeder Typ seine eigene Serviceschnittstelle erhält, startet eine Transaktion (und aktiviert auch in der WCF-Schnittstelle den Transaktionsmodus) und schickt die Daten über Einzelaufrufe an den Server. Falls kein Problem auftritt wird die Transaktion beendet. Imho müsste dafür Per-Session gearbeitet werden.
Wie geht man hierbei am Besten im Zusammenhang mit WCF vor? Bzw. verstehe ich hier die Optionen gänzlich falsch?
-
Man muss ja WCF, bzw. in diesem Fall den DataContractSerializer, nicht 100% "pur" verwenden.
Spricht nix dagegen Daten mit einem Serializer der Wahl in eine XmlNode zu verbasteln und diese dann ins Datentransferobjekt reinzustöpseln.
Also nix ausser dass es natürlich nicht mehr so comfortabel ist
-
hustbaer schrieb:
Man muss ja WCF, bzw. in diesem Fall den DataContractSerializer, nicht 100% "pur" verwenden.
Spricht nix dagegen Daten mit einem Serializer der Wahl in eine XmlNode zu verbasteln und diese dann ins Datentransferobjekt reinzustöpseln.
Also nix ausser dass es natürlich nicht mehr so comfortabel istWenn ich es richtig heraus lese, würdes du im wesentlichen zu einer Abwandlung von Variante a greifen, die zwar mehr Flexibilität erlaubt, aber sich weiterhin an die Regel hält: Alle Daten in einem Serviceaufruf übergeben.
Deine Lösung würde aktuell für mich zuviel des Guten sein, wäre aber wenn ich es tichtig verstehe ein Ansatz den ich auch noch nachträglich in Variante a unterbringen und bei dem ich auf Per-Call einschießen könnte.
-
Ich weiss ehrlich gesagt nicht ob ich das machen würde.
Ich meine nur es ist eine 3. Möglichkeit die du nicht angeführt hast
(Bzw. andere Möglichkeit Variante A umzusetzen)Ich weiss nur, dass ich auf jeden Fall alle Daten in einem Service-Aufruf übergeben wollen würde. (Ausgenommen natürlich Fälle wo "alle Daten" bedeutet dass man einen zig MB grossen Request bekommen würde.)