2009-03-18 9 views
2

Bild, wenn man so will, das folgende Szenario:Rückkehr Business Object von Web Service

  • BusinessObjects.dll enthält eine Klasse "Businessobject"
  • WinClient BusinessObjects.dll Business
  • Web Service Referenzen verweist. dll

Web-Service verfügt über eine Methode:

public BusinessObject GetBusinessObject() 
{ 
    BusinessObject result = new BusinessObject; 
    result.Name = "MyBusinessObject"; 
    return result; 
} 

Diese Methode wird vom WinClient aufgerufen.

Wenn ich den Verweis auf WebService hinzufüge, wird eine Proxy-Klasse erstellt. Wenn ich also von Businessobject WinClient zugreifen wie so:

BusinessObject bObj = service.GetBusinessObject(); 

dann bobj ist nicht das gleiche Objekt in BusinessObject.dll, ist aber eigentlich der Proxy.

Es gibt eine Behelfslösung wie hier dokumentiert - http://ryanfarley.com/blog/archive/2004/05/26/737.aspx

Meine Frage - ist das eine gute Idee? Oder sollten Objekte, die von einem Service zurückgegeben werden, IMMER als einfache DTOs behandelt werden? Wenn wir also die Logik wollen, sollten wir die Werte in das REAL businessObject kopieren. Aber was ist mit der Leistung, die dabei erreicht wird - sollte ich mich darum sorgen?

Jede Rückmeldung willkommen, danke.

Antwort

2

Ja, verwenden Sie immer ein DTO oder etwas ähnliches.

Der Performance-Hit beim Kopieren von Daten im Speicher ist wahrscheinlich trivial im Vergleich zur Leistung des Netzwerks, das die Daten durchlaufen werden.

2

Es hängt davon ab, ob die "Reinheit" des Dienstes wichtig ist. Wenn die nur Client wird Ihre exe sein, dann würde ich nicht gestresst werden; Sie können dann ein "intelligentes" (wenn Sie sehen, was ich meine) Objekt auf dem Client (z. B. Implementierung IDataErrorInfo für die Validierung), ohne Code-Duplizierung.

Wenn Sie jedoch Ad-hoc-Clients unterstützen müssen, sollten Sie sich an grundlegende DTOs (Proxy-Objekte) halten.

Beachten Sie, dass Sie dies in WCF ohne Änderungen tun können, wenn Sie diese Route (Assembly Sharing) gehen möchten; svcutil und die IDE bieten Optionen zur Wiederverwendung von Typen aus bestehenden Baugruppen, obwohl Sie dies eigentlich gar nicht benötigen (Sie können direkt auf einen Kanal zugreifen). Sie benötigen lediglich die richtigen Konfigurationsdaten in der app.config, damit Sie wissen, wo Sie den Service finden.

+0

Wenn Ihre EXE der einzige Client ist, der den Webdienst verwendet, warum sollte es überhaupt ein Webdienst sein? – darasd

+0

er, um die Daten über das Internet zu bekommen, oder wo Firewalls nur einfache Protokolle wie http erlauben ... –