Sie haben sehr ähnliche Anwendungsfälle, da ich als leitender Betreuer des ServiceStack-Projekts einen guten Einblick in die Vorteile von ServiceStack und die vielen natürlichen Vorteile seines nachrichtenbasierten Designs habe .
ServiceStack gibt es seit 2008 als OSS-Projekt von Anfang an mit dem einzigen Ziel, das korrekte Design und die Implementierung reibungsloser Remote-Dienste zu fördern.
Einfaches und elegantes Design
In seinem Streben nach ultimativer Einfachheit basiert es auf einem einfachen und eleganten Kern - wobei die meisten Funktionen natürlich an Ihre Modelle und nicht an Ihre Controller gebunden sind -, wie es MVC, WebApi (und jedes andere von Microsoft erstellte Web Service Framework) tut ).
Die Verwendung eines nachrichtenbasierten Designs bietet einen überlegenen Ansatz für Remotedienste, da sie erweiterbare und weniger spröde Dienste fördern, Zugriffs- und Anrufmuster vereinfachen und viele andere natürliche Vorteile enthalten, die Sie kostenlos erhalten .
Als Kernaufgabe bekämpfen wir die Komplexität in jeder Phase, um eine unsichtbare und nicht aufdringliche API zu erhalten und die Einführung neuer Konzepte oder künstlicher Konstrukte zu vermeiden, die .NET- oder Webdienstentwicklern heute noch nicht vertraut sind.
Als Beispiel ist Ihre IService<T>
Service-Implementierung nur eine Standard-C # -Klasse mit automatisch verdrahteten Abhängigkeiten. Dünne und leichte Wrapper werden verwendet, um eine konsistente und einheitliche API für die Kerntypen IHttpRequest und IHttpResponse zur Laufzeit bereitzustellen . Sie ermöglichen auch den Zugriff auf zugrunde liegende ASP.NET- oder HttpListener-Anforderungs- und Antwortklassen, sodass Sie bei der Verwendung von ServiceStack niemals eingeschränkt werden.
Im Gegensatz zu WCF und WebApi
Hier ist eine kurze Übersicht über die gegensätzlichen API-Stile, die ServiceStack und WCF fördern . WebApi unterscheidet sich von WCF darin, dass es das REST-vollständige API-Design fördert. Beispiele zwischen den beiden sind das einzige bekannte Beispiel, das ich mit demselben Dienst habe, der sowohl in ServiceStack als auch in WebApi geschrieben wurde .
Best Practices Remote-Dienste
ServiceStack konzentriert sich in erster Linie auf Einfachheit, Leistung und die Förderung von Best Practices für Web- / Remote-Services, bei denen es darum geht, Martin Fowlers Remote-Service-Entwurfsmuster in einem möglichst idiomatischen C # zu berücksichtigen:
Das Fassadenmuster - Dies schlägt die Verwendung von stapelbaren, grobkörnigen Schnittstellen vor, wenn Sie über Prozessgrenzen hinweg kommunizieren.
Das DTO-Muster ( MSDN ) - Festlegen der Verwendung von speziellen POCOs zum Generieren des Drahtformats Ihrer Webdienstantworten.
Das Gateway-Muster ( MSDN ) zum Einkapseln Ihrer Client- und Serverkommunikation zwischen den Client-Gateway / DTO-Modellen und den Service Interface-Ebenen.
Diese Muster gewährleisten eine saubere Trennung von Bedenken und eine reibungslose iterative Entwicklererfahrung.
Stärken Sie Ihre Dienste
Ein ServiceStack-Webdienst konzentriert sich im Kern auf eine abhängigkeitsfreie und automatisch verdrahtete reine C # IService<T>
-Schnittstelle, mit der Sie Ihren Webdienstvertrag mit Ihren eigenen Anforderungs- und Antwort-DTOs mithilfe sauberer POCOs vollständig definieren können. Dadurch wird die API von ServiceStack praktisch unsichtbar und nicht sichtbar -invasiv, dh es ist trivial, Ihre C # -Dienstlogik zu extrahieren und außerhalb eines ServiceStack-Hosts auszuführen.
Diese Übersicht ist ein gutes Beispiel dafür, was Sie mit nur 1 C # .cs-Klasse in ServiceStack erhalten :
- Metadatenseiten für alle registrierten Formate
- Mit Links zu WSDLs, XSDs und C # -Client-Beispielen
- Menschenfreundliche HTML-Berichtsansicht
- Ein einzelner in sich geschlossener HTML-Seiten-Snapshot (dh keine externen Refs). Enthält eine eingebettete JSON-Webdienstantwort - ermöglicht den programmgesteuerten Zugriff auf Datenschnappschüsse.
- Eingebauter Mini Profiler (Port des exzellenten MVC Mini Profiler )
- Beinhaltet SQL-Profilerstellung
- JSON / JSONP-, XML-, JSV-, CSV- und SOAP-Endpunkte
Die Klassen RestServiceBase und ServiceBase sollen Ihre benutzerdefinierte C # -Logik für eine maximale mögliche Wiederverwendung hosten, z. B. ermöglicht das DTO-First-Design trivial eine verzögerte und Proxy-Ausführung, bei der derselbe C # -Dienst auch auf einem MQ-Host gehostet und ausgeführt werden kann Dies passiert, wenn Sie einen IMessageService
wie den RedisMQ-Host registrieren und Ihren Dienst über den /asynconeway
Endpunkt anrufen (dh client.SendOneWay()
in C # -Clients).
Sie können Composite-Services auch einfach delegieren und erstellen, indem Sie die base.ResolveService<T>()
Methode verwenden, die eine automatisch verdrahtete Instanz des ausgewählten Service zurückgibt, wie im Beispiel des Nortwind CustomerDetails-Service dargestellt :
var ordersService = base.ResolveService<OrdersService>();
var ordersResponse = (OrdersResponse)ordersService.Get(
new Orders { CustomerId = customer.Id });
Geben Sie einfache C # -Objekte zurück
Zum größten Teil serialisiert ServiceStack die meisten C # -Objekte wie erwartet - hier eine Liste möglicher Rückgabetypen ( aus dieser Antwort ):
- Jedes DTO-Objekt -> serialisiert zu Response ContentType
- HttpResult, HttpError, CompressedResult (IHttpResult) für benutzerdefinierte HTTP-Antwort
Die folgenden Typen werden nicht konvertiert und direkt in den Antwortstrom geschrieben:
- String
- Strom
- IStreamWriter
- Byte [] - mit dem Inhaltstyp application / octet-stream.
Ein Beispiel für die Unterstützung von benutzerdefinierten HTTP-Headern finden Sie in diesem CORS-Beispiel, in dem Sie HTTP-Header global oder pro Dienst konfigurieren können.
HTML-Unterstützung
Es gibt mehrere Optionen für die Rückgabe von HTML in ServiceStack, die hier ausführlich erläutert werden .
Enthält die schnellsten Text- und Binärserialisierer für .NET
Ausfallsichere und schnelle Serialisierer sind in einer API von größter Bedeutung, um schnelle Antwortzeiten und eine versionierbare API zu gewährleisten, die vorhandene Clients nicht beschädigt. Aus diesem Grund enthält ServiceStack die schnellsten Textserialisierer für .NET mit einer NuGet-Option zum Aktivieren des Protokolls von @marcgravell Puffer (.NETs schnellster binärer Serializer).
Die Textserialisierer von ServiceStack sind sehr belastbar und können ohne Fehler einer extremen Versionierung standhalten .
Reibungslose Entwicklererfahrung von Ende zu Ende
Die Meinung von ServiceStack ermöglicht eine schnelle, typisierte, knappe Web-Service-API von Ende zu Ende mit integrierter Unterstützung für Sync / Async C # /. NET- und Async Silverlight-Clients ohne Code-Gen:
C # -Beispiel synchronisieren
var response = client.Send<HelloResponse>(new Hello { Name = "World!" });
Async C # Beispiel
client.SendAsync<HelloResponse>(new Hello { Name = "World!" },
r => Console.WriteLine(r.Result), (r, ex) => { throw ex; });
Da es nur reines JSON zurückgibt, wird es auch trivial mit anderen HTTP-Clients verwendet, z. B. JS-Client-Beispiel mit jQuery :
$.getJSON("http://localhost/Backbone.Todo/todos", function(todos) {
alert(todos.length == 1);
});
Sehr gut testbar
Alle C # /. NET ServiceClients verwenden dieselben Schnittstellen, sodass sie in hohem Maße testbar und austauschbar sind, sodass Sie denselben Komponententest auch als XML-, JSON-, JSV- und SOAP-Integrationstest verwenden können .
Integrierte umfassende Validierung und Fehlerbehandlung
In seiner Mission, eine reibungslose und saubere Entwicklererfahrung zu bieten, umfasst ServiceStack auch die integrierte typisierte Validierung und Fehlerbehandlung , bei der das Auslösen einer C # -Ausnahme oder die Verwendung der integrierten Fluent-Validierung Clients strukturierte, typisierte Fehler bietet, auf die Webdienst-Clients leicht zugreifen können , z.B:
try {
var client = new JsonServiceClient(BaseUri);
var response = client.Send<UserResponse>(new User());
} catch (WebServiceException webEx) {
/*
webEx.StatusCode = 400
webEx.ErrorCode = ArgumentNullException
webEx.Message = Value cannot be null. Parameter name: Name
webEx.StackTrace = (your Server Exception StackTrace - if DebugMode is enabled)
webEx.ResponseDto = (your populated Response DTO)
webEx.ResponseStatus = (your populated Response Status DTO)
webEx.GetFieldErrors() = (individual errors for each field if any)
*/
}
Um es trivial zu machen, Fehler in JavaScript zu konsumieren, können Sie die einfache JavaScript-Bibliothek ss -alid.js verwenden, um Ihre Antwortfehler mit einer einzigen Codezeile trivial an Ihre HTML-Formularfelder zu binden. Das Beispielprojekt SocialBootstrapApi bietet eine gute Demo dafür.
Umfangreiche Integration mit ASP.NET und MVC
Das ServiceStack MVC PowerPack schreibt viele Probleme von ASP.NET und MVC neu und behebt sie, indem es die lähmenden Session- und Caching-XML-belasteten ASP.NET-Anbieter mit einer eigenen sauberen und abhängigkeitsfreien Implementierung von ICacheClient- und ISession-APIs ersetzt.
ServiceStack enthält auch ein neueres und saubereres Modell für Authentifizierungs- und Autorisierungsanbieter mit einer Reihe verschiedener integrierter AuthProvider:
- Anmeldeinformationen - Zur Authentifizierung mit Anmeldeinformationen für Benutzername / Kennwort durch Senden an den Dienst / auth / credentials
- Basisauthentifizierung - Ermöglicht Benutzern die Authentifizierung mit der Basisauthentifizierung
- Twitter OAuth - Benutzer können sich bei Twitter registrieren und authentifizieren
- Facebook OAuth - Benutzer können sich bei Facebook registrieren und authentifizieren
Das Authentifizierungsmodul ist völlig optional und basiert auf den sauberen ICacheClient / ISession-APIs und OrmLite, mit denen Ihre Sitzungen in Memory, Redis oder Memcached gespeichert werden können und Ihre UserAuth-Informationen in den von OrmLite unterstützten RDBMS von SQLServer, MySql, PostgreSQL, Sqlite as gespeichert bleiben sowie Redis Data-Store oder InMemory (nützlich für Entwickler / Tests).
Großartige Dokumentation
ServiceStack ist sehr gut dokumentiert, wo die meisten Informationen über das Framework im GitHub-Wiki gehostet werden . Die Dokumentation für andere Teile des Frameworks (z. B. Serializer, Redis, OrmLite) finden Sie unter servicestack.net/docs/.
Das ServiceStack.Examples- Projekt bietet den Quellcode für alle Live-Demos und Starter-Vorlagen von ServiceStack, während das SocialBoostsrapApi-Projekt einen hervorragenden Ausgangspunkt für die Entwicklung einer Backbone.js-Single-Page-App mit ServiceStack und MVC auf der Basis der Twitters Bootstrap-Vorlage bietet.
Darüber hinaus enthält die Google-Gruppe einen Schatz an Informationen, der in den letzten Jahren erheblich zugenommen hat.
Läuft überall
ServiceStack ist ein .NET 3.5-Framework, das auf ASP.NET- und HttpListener-Hosts ausgeführt wird und entweder auf .NET oder Mono gehostet werden kann ( Wissenswertes : www.servicestack.net wird von CentOS / Mono unterstützt). Auf diese Weise können Ihre ServiceStack-Webdienste auf folgenden Websites gehostet werden:
Windows mit .NET 3.5 & 4.0
Linux / OSX mit Mono
- Apache + mod_mono
- Nginx + MonoFastCGI
- XSP
- Konsolen-App
Entwickelt mit dem Open Source-Entwicklungsmodell
ServiceStack glaubt fest an das Open Source-Entwicklungsmodell, bei dem es aktiv im Freien entwickelt wird und seit seiner Einführung immer unter einer liberalen OSS-Lizenz (New BSD) gehostet wird . Bis heute hat es Beiträge von mehr als 47 Entwicklern erhalten und steht derzeit am dritthäufigsten C # -Projekt auf GitHub .
Nachteile
Ich glaube, der größte Nachteil ist der gleiche für die meisten anderen OSS .NET-Projekte, bei denen es nicht von Microsoft entwickelt (oder sogar als verfügbare Option aufgeführt) wurde. Dies bedeutet, dass es bei der Bewertung eines Frameworks selten die erste Wahl ist. Die meisten Anwender bewerten ServiceStack nur als letzten Ausweg, wenn sie entweder frustriert sind über die Reibung und Sprödigkeit von WCF oder die Leistung des bevorzugten Microsoft Stacks.
Feedback und Community-Ressourcen
ServiceStack wurde von den meisten Personen, die es als durch die positive Stimmung in der Mailinggruppe sichtbar bewertet haben, sehr positiv aufgenommen . Seit diesem Jahr verfolgt der Twitter-Account von @ServiceStack Erwähnungen und Feedback in seinen Favoriten .
Die Wiki-Seite für Community-Ressourcen ist ein guter Ort, um mehr über ServiceStack in the Wild mit Links zu Blog-Posts, Pod Casts, Präsentationen, Gists und mehr zu erfahren.