2012-11-30 9 views
7

Wir bauen unsere erste kleine Implementierung von ServiceStack auf und wir benötigen einige Erläuterungen zu DTOs, die sich in einer separaten Assembly befinden, die sich der Client und der Server teilen.ServiceStack DTO Assembly

The WIKI page for the new API empfiehlt für DTO

In Service Entwicklung Ihre Dienste DTOs Ihre Technologie agnostisch Service Layer zur Verfügung, die Sie sauber und als ‚Abhängigkeit frei‘ wie möglich für maximale Zugänglichkeit und potenziellen Wieder behalten wollen -benutzen. Unsere Empfehlung ist es, Ihre Service-DTOs in einer separaten, weitgehend dep-freien Montage zu halten.

Es gibt auch diese Schnipsel

* Aber lassen Sie uns sagen, dass Sie die normale Route nehmen die DTOs kopieren (entweder als Quelltext binärer Form), so haben Sie so etwas wie dies auf dem Client:

[Route("/reqstars")] 
public class AllReqstars : IReturn<List<Reqstar>> { } 

The code on the client now just becomes: 

var client = new JsonServiceClient(BaseUri); 
List<Reqstar> response = client.Get(new AllReqstars()); 

, die an die/reqstars Route eine GET-Web-Anfrage macht. Wenn eine benutzerdefinierte Route nicht auf dem Client vorhanden ist, greift sie automatisch auf die vordefinierten Routen von ServiceStack zurück.

Meine Frage ist ... ist die „weitgehend dep frei“ Montag erfordert noch eine Abhängigkeit von ServiceStack aufgrund der Strecken Attributs auf den DTO-Klassen?

Antwort

7

Das [Route] Attribut existiert im ServiceStack.Interfaces Projekt, so müssen Sie nach wie vor nur einen Verweis auf die Abhängigkeit und impl freien ServiceStack.Interfaces.dll. Dies ist beabsichtigt, um eine möglichst geringe Abhängigkeit zu gewährleisten. Aus diesem Grund versuchen wir, alle Metadatenattribute, die Sie für DTOs verwenden, im Interfaces-Projekt beizubehalten.

Der Grund dafür, dass Sie Ihre DTOs in einer separaten Assembly aufbewahren möchten, besteht darin, die Abhängigkeiten zu reduzieren, die von Ihren Clients benötigt werden, um sie verwenden zu können. Dies macht es weniger invasiv und für die Kunden zugänglicher. Auch Ihre DTOs stellen Ihren Servicevertrag dar. Wenn Sie sie getrennt aufbewahren, wird die gute Praxis gefördert, sie von der Implementierung zu entkoppeln, die Sie weiterhin frei gestalten können.

+1

Danke mythz. Ich bin dafür, die DTOs in einer separaten Versammlung zu halten, ich war mir nur nicht sicher, ob es eine Methode gab, diese Versammlung auf Null zu setzen. –

+0

@mythz Ich bin in Ehrfurcht vor ServiceStack und ein wenig überwältigt von der Menge an Informationen (viele widersprüchlich). Diese Antwort hat mir auf dem richtigen Weg geholfen, eine ServiceModel-DLL mit meinen DTOs zu erstellen, aber ich habe in ServiceStacks Dokument nichts gefunden, was darauf hinweist. Es gibt nirgendwo dort, das besagt, dass die einzige benötigte Referenz ServiceStack.Interfaces ist. Die RESTIntro ServiceModels enthalten Verweise auf viele DLLs, daher ist es auch verwirrend. Gibt es ein nugget-Paket, um nur diesen minimalen Verweis auf ein ServiceModel zu erhalten? – Loudenvier

+1

@Loudenvier ServiceStack.Interfaces befindet sich im ServiceStack.Common NuGet-Paket, NuGet hat im Moment nichts mehr zu tun (es wird nach dem großen NuGet-Re-Faktor geben). In der Praxis ist dies kein Problem, da "ServiceStack.Common" das min-Paket ist, das benötigt wird, damit Clients die [typisierten .NET Clients von ServiceStack verwenden können] (https://github.com/ServiceStack/ServiceStack/wiki/C% 23-Client). Im Allgemeinen sollten Sie danach streben, Ihre Servicemodelle entlastungsfrei zu halten und die von den Kunden benötigten Depressionen/Reibungsverluste zu minimieren. – mythz