Unser Unternehmen startet eine ziemlich große SOA-Initiative. Wir machen eine Menge richtig: Es gibt gute Kommunikation; gegebenenfalls Geld für Werkzeuge; und wir haben einige gute Fachkenntnisse mitgebracht, um uns bei der Umstellung zu helfen.
Wir versuchen Standards zu entwickeln, denen wir als Gruppe folgen können, und einer der vorgeschlagenen Standards stört mich ziemlich:
Wir haben das Muster standardisiert, bei dem jede Operation ein Anforderungsobjekt entgegennimmt und ein Antwortobjekt zurückgibt.
Mir ist klar, dass dies für viele mehr oder weniger ein Standardansatz ist, aber ich frage mich, warum ich mich darum kümmern soll. (Ich bin nicht so gut mit erhaltener Weisheit, ich brauche einige Gründe).
Die meisten der Dienste, die ich bereitstellen werde, sind das einfache Abrufen von Organisationsmetadaten. Suchen Sie beispielsweise die Sicherheitsrichtlinie für einen bestimmten Benutzer. Dies erfordert eine Benutzer-ID und sonst nichts. Der Standard sagt mir, dass ich diese Anforderung in ein Objekt und die zurückgegebene Richtlinie in ein Antwortobjekt einschließen soll.
Mein Unbehagen wird durch einen Blick auf die WSDL verstärkt, die sich aus unseren Verträgen ergibt. WCF generiert automatisch Anforderungs- und Antwortnachrichten und umschließt sogar das Anforderungs- / Antwortobjekt.
Ich verstehe voll und ganz, dass ein komplexes Eingabeobjekt gerechtfertigt ist, wenn Sie eine komplexe Anfrage stellen. Das ist es, was Sie tun würden, selbst wenn die Dienste nicht involviert wären.
Meine Frage ist, warum ich Anfragen und Antworten automatisch verpacken soll, wenn:
- Es macht einfache Dienste weniger aussagekräftig
- Sie würden es trotzdem für einen komplexen Service tun
- WCF erstellt trotzdem eine Anfrage- / Antwortnachricht
Ich habe die folgenden Argumente für diesen Ansatz gefunden:
Die Versionierung wird unterstützt, indem optionale Parameter in das Anforderungsobjekt eingefügt werden.
Früher habe ich einiges an COM gemacht, und ich würde dies fast als Anti-Pattern für die Versionierung betrachten. Für einige Dinge würde es wahrscheinlich helfen, aber ich gehe davon aus, dass Sie dort, wo es helfen würde, sowieso bereits ein Parameterobjekt haben.
Dadurch können allgemeine Daten und Verhaltensweisen für eine Basisklasse isoliert werden
Dieser trägt etwas Gewicht bei mir.
Es lenkt Menschen von einem Verhalten im RPC-Stil weg und hin zu einem Messaging-Verhalten
Ich habe dies auf der Microsoft-Website gelesen und es von unserem Guru gehört, aber ich habe immer noch keine klare Vorstellung davon, was sie bedeuten oder warum es wertvoll ist. Ist es so, dass natürlich aussehende Benutzeroberflächen dazu neigen, zu vergessen, dass sie einen Remote-Service anrufen?
Ich bin gerade dabei, die Signaturen von vielleicht 300 Methoden zu überarbeiten, das ist also eine nicht unbedeutende Menge an Schmerz. Ich bin ein großer Fan von Konsequenz bei der Implementierung, daher bin ich bereit, den Schmerz in Kauf zu nehmen. Es hilft nur zu wissen, dass sich alles am Ende lohnt.
Ich denke, Martin Fowlers Anmerkungen zum Datenübertragungsobjekt sind hier angebracht.
Gleiches kann für Anfragen gelten. Was RPC betrifft, und warum ist es schlecht:
Ich denke das ist wahr, aber nicht der Hauptgrund. Ein weiterer Grund, RPC zu vermeiden, besteht darin, dass eng gekoppelte Clients und Dienste gefördert werden können.
quelle