2010-09-08 21 views
6

Ich habe einen Datenvertrag sagen Benutzer. Es ist serialisierbar und geht über die Leitung. Ich möchte einen Operation Contract SaveUser(). Ich kann SaveUser (User user) in meinem Servicevertrag als Betriebsvertrag beibehalten. Aber kann ich es in meinem Datenvertrag selbst als eigenes Verhalten behalten?Kann ein WCF-Datenvertrag einen WCF-Betriebsvertrag enthalten? Warum?

Save() sollte sich am besten selbst speichern. Gemäß den OO-Prinzipien sollte jeder Datenvertrag wissen, wie er sich selbst retten kann, und die Details sollten von der Außenwelt abstrahiert werden.

Ist dies in WCF möglich?

Antwort

9

Ich würde Nein sagen, und das zu Recht. Obwohl ich mit Ihnen über die OO-Prinzipien und die Einkapselung einverstanden bin, befasst sich WCF mit SO (serviceorientierten) Prinzipien. Denken Sie daran in Bezug auf einen CD-Player und CDs. Der CD-Player ist der Service. Die CD ist der Datenvertrag. OO-Prinzipien würden verlangen, dass die CD eine Play-Methode hat, um selbst spielen zu können. Aber es gibt viel mehr zum Abspielen einer CD als das Wissen um die Daten. Es gibt die Elektronik, die Schnittstelle zu den Ausgangsbuchsen usw. Diese werden alle vom CD-Player zur Verfügung gestellt ... der Service. Das ist der Grund, warum Ihr Servicevertrag die Play-Methode hat und die CD als Datenvertrag akzeptiert, in dem Sie angeben, WAS Sie spielen sollen (und nicht WIE Sie es spielen).

EDIT nach der Frage in Ihrem Kommentar: Nein sicher (hoffentlich) nicht. Im schlimmsten Fall erhalten Sie 34 Serviceverträge mit jeweils durchschnittlich 6 Methoden. Und das ist nur der Fall, wenn Sie sicher sind, dass jede der Methoden in jeder Klasse als Service-Operation passieren muss. Es gibt zwei Aspekte, die Sie beachten müssen. Aspekt 1: Die Gestaltung Ihrer Dienstleistungen. Statt 34 Serviceverträge sollten Sie die 34 Klassen zu einer sinnvollen Gruppierung zusammenfassen und 1 Servicevertrag pro Gruppe anlegen. Beispielsweise können Sie einen InventoryManagement Service und einen SalesOrderProcessing Service und einen BackOfficeOperations Service erhalten. Jeder dieser Dienste enthält die Servicevorgänge (und Datenverträge), die für den Bereich von Klassen relevant sind, die in ihrer Domäne gruppiert sind. Aspekt 2: Was passiert auf dem Client? Ich erwähnte, dass Sie überlegen müssen, ob die Methoden jeder Klasse WCF Service Operations sein müssen. Es gibt sicherlich einen Fall für reiche voll gekapselt Business-Klassen auf dem Client. Und wenn ihre Operationen nicht als Dienstoperationen ausgeführt werden müssen, führen diese Operationen ihre Logik in der Clientdomäne aus. Die Frage ist, wie man sie über einen Dienst zum Client bringt, und hier haben Sie zwei Alternativen: a) Instanziieren einer Instanz auf dem Client und Auffüllen ihrer Eigenschaften aus dem von einer Dienstoperation zurückgegebenen DataContract. b) das Objekt direkt von einer Dienstoperation zurückgeben, wie es in einem Framework wie CSLA getan wird (und ich denke, dass DevForce einem ähnlichen Ansatz folgt, um Geschäftsklassen über einen WCF-Dienst zurückzugeben). HTH

+1

Also, wenn ich 34 Klassen mit 6 öffentlichen Methoden im Durchschnitt in jeder Klasse habe, würde ich 204 Wrapper-Methoden im Dienst haben? ist das ok? –

+0

Schöne Antwort ... Sehr hilfreich, meine Zweifel zu klären. – Pranav