| 

.NET C# Java Javascript Exception

5
Wir sind grad dabei das Design für eine neue Anwendung zu erstellen. Aus Erfahrung möchten wir daher einige Dinge anders machen.

Frage: Wir möchten quasi das WCF als eine gesonderte Schicht einfügen, so dass wir in der Lage sind diese Klassen universell zu benutzen

Im Momement ist es ja so, dass die Contracts für jedes Object, was übertragen wird, erstellt werden muss. Außerdem würden wir für jedes Modul einen "eigenen" Serverendpunkt brauchen. Wenn wir daher Kontakte und Artikel haben dann sind das schon mal zwei (teilweise sehr komplexe) Contracts. Außerdem sind die Änderungen/Erweiterung aus meiner Sicht dann immer sehr umfangreich, wenn man neue Eigenschaften/Funktionen hinzufügen möchte.

Unsere Idee: Wir schreiben eine Klasse, die in der Lage ist unsere Konktake und was damit passieren soll (Hinzufügen, Löschen etc.) "umwandelt" - via WCF "verschickt". Der Server empfängt auf dem Endpunkt "MyGenerellServer" das Paket. Der "entpackt" das ganze und erkennt dann, welche Klasse instanziert werden muss und was diese tun soll.

Was unbedingt gefordert ist: ALLE angemeldeten Clients, die z.B. auf die Artikelliste zugreifen, müssen über eine Änderung informiert werden, wenn sich die Artikelinformationen ändern. Das geschieht meines Wissensüber Callbacks. Aber wenn 100te von Änderungen im Gesamtsystem sind, empfangen die Clients nicht dann sehr viele unnötige Callbacks, wenn sie nicht grad die Artikelliste anzeigen müssen?

Ich wäre sehr dankbar für ein paar nette Ideen

PS: Was ich mich frage, warum hat noch keiner so eine "generelle Kommunikations"-Schicht erstellt? Was spricht dagegen?
12.01.2013
MyKey0815 1,6k 2 9
2 Antworten
2
PS: Was ich mich frage, warum hat noch keiner so eine "generelle Kommunikations"-Schicht erstellt? Was spricht dagegen?

WCF ist selbst eine generelle Kommunikationsschicht - da nochmal eine eigene drüber zu legen erscheint mir ungefähr so sinnvoll, wie einen Joystick in ein Auto einzubauen, um damit das Lenkrad zu steuern ;-)

Was passiert denn, wenn Du einen WCF-Service aufrufst? Der Client baut eine Nachricht zusammen (z.B. eine SOAP-Message) und kodiert darin neben den zu übertragenden Nutzdaten, welcher Service bzw. Service-Operation aufgerufen werden soll. Die schickt er dann über den Transport-Kanal (z.B. HTTP) an den Server. Der Server wertet die Nachricht aus, besorgt sich die passende Service-Instanz, deserialisiert die Daten und ruft die gewünschte Operation auf. Nichts anderes würde Dein "MyGenerellServer" machen, jedenfalls wenn ich Dich richtig verstanden habe.

Wenn es Dich stört, mehrere Endpunkte zu haben, dann schreib eine Fassade, die alle benötigten Operationen in einem Service vereinigt. Das Versionierungsproblem wirst Du mit Deinem Ansatz nicht los, sondern verschiebst es nur an eine andere Stelle - genausogut könntest Du Dich mit den Möglichkeiten beschäftigen, die WCF dafür bietet. Floyd hat das in seiner Antwort schon kurz skizziert, jedes gute WCF-Buch wird das Thema ebenso behandeln. Das Callback-Problem schließlich scheint mir ein separates Thema zu sein, das Du nicht mit dem ersten vermischen solltest (und das auch eine eigene Frage verdient hätte).
19.01.2013
Matthias Hlawatsch 13,2k 4 9
5
Für das Thema der Callbacks gibt es den so genannten Publish-Subscribe-Pattern. Clients die Interesse an Aktualisierungen der Artikelliste haben hängen sich auf ein spezielles Event. Dieses Event kannst du per WCF werfen MSDN:The Publish-Subscribe Framework.

Zu dem anderen Thema (veränderliche Objekte/Contracts). Nun ich würde einen Basis-Contract einführen der eine Versionsnummer und Informationen zur Abwertskompatibilität enthällt und alle weiteren Contracts davon ableiten (Stichwort abstrakte Klasse). Dann kannst du einfacher neue Felder hinzu fügen. Schwieriger wird es Felder zu entfernen, umzubenennen oder Methoden-Signaturen, Return-Typen etc. zu ändern. Notfalls wäre es eine Möglichkeit auf Contracts für Objekte zu verzichten und XML einzusetzten.
13.01.2013
Floyd 14,6k 3 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH