Derzeit gibt es weitere wichtige Unterschiede zwischen WebApi und WCF Data Services, die niemand zu erwähnen scheint. Ich wünschte, MS würde einen guten Artikel herausbringen, in dem die beiden verglichen werden.
Ich verfolge OData seit einer Weile und auch WebApi. Ich habe immer ein paar große Unterschiede gefunden.
Erstens bin ich mir nicht sicher, was Ihr Chef mit "MS unterstützt WebApi" meint, was bedeutet, dass sie OData nicht unterstützen? IMO, sie unterstützen beide und derzeit gibt es einige minimale Überlappungen. Windows Azure Data Market macht seine Daten mithilfe von OData verfügbar, Azure Table Storage verwendet OData, SharePoint 2010 ermöglicht OData-Abfragen über seine Daten und andere Produkte von MS unterstützen dies ebenfalls, z. B. Excel PowerPivot. Es ist ein sehr leistungsfähiges Abfrage-Framework, wenn es um relationale Daten geht. Und weil es RESTful ist, kann jede Sprache, jedes Framework, jedes Gerät usw. in es integriert werden.
Folgendes gefällt mir an OData + WCF Data Services:
OData + WCF Data Services hat es Client-Anwendungen endlich ermöglicht, bei der Abfrage von Daten über das Web "ausdrucksstärker" zu sein. Früher mussten wir immer ASMX oder WCF verwenden, um starre Web-APIs zu erstellen, die unhandlich werden und ständige Änderungen erfordern, wenn eine Benutzeroberfläche etwas anderes wünscht. Die Clientanwendung konnte nur Parameter angeben, um festzulegen, welche Kriterien zurückgegeben werden sollen. Oder machen Sie es wie ich und "serialisieren" Sie LINQ-Ausdrücke und übergeben Sie diese als Parameter und rehydrieren Sie sie erneut Expressions<Func<T,bool>>
auf dem Server. Es ist anständig. Ich habe die Arbeit erledigt, möchte aber LINQ auf dem Client verwenden und es mit REST über das Web übersetzen lassen. Genau das erlaubt OData und ich möchte keinen eigenen "Hack" einer Lösung verwenden.
Es ist so, als würde man "TRANSACT SQL" ohne die Notwendigkeit einer DB-Verbindungszeichenfolge verfügbar machen. Geben Sie einfach eine URL und whoala an! Starten Sie die Abfrage. Natürlich unterstützen sowohl WebApi als auch WCF Data Services die Authentifizierung / Autorisierung, sodass Sie den Zugriff steuern und zusätzliche "Where" -Anweisungen basierend auf Rollen oder anderen Datenkonfigurationen anhängen können. Ich mache das lieber in meiner Web-API-Ebene als in SQL (wie beim Erstellen von Ansichten oder gespeicherten Prozessen). Und jetzt, da Anwendungen Abfragen selbst erstellen können, werden Ad-Hoc- und BI-Berichterstellungstools beginnen, OData zu nutzen und Benutzern die Möglichkeit zu geben, ihre eigenen Ergebnisse zu definieren. Sie verlassen sich nicht auf statische Berichte, bei denen sie nur minimale Kontrolle haben.
Bei der Entwicklung in Silverlight, Windows 8 Metro oder ASP.NET (MVC, WebForms usw.) können Sie dem WCF-Datendienst einfach eine "Dienstreferenz" in Visual Studio hinzufügen und schnell mit LINQ Daten abfragen UND erhalten eine "Datenkontext" auf dem Client bedeutet, dass Änderungen nachverfolgt werden und Sie Ihre Änderungen atomar an den Server "senden" können. Dies ist sehr ähnlich zu RIA Services for Silverlight. Ich hätte WCF Data Services anstelle von RIA Services verwendet, aber zu diesem Zeitpunkt wurden keine DataAnnotations oder Actions unterstützt, jetzt jedoch :) WCF Data Services hat einen weiteren Vorteil gegenüber RIA Services, nämlich die Möglichkeit, "Projektionen" durchzuführen. vom Kunden. Dies kann die Leistung verbessern, falls ich nicht alle Eigenschaften einer Entität zurückgeben möchte. Einen "Datenkontext" haben
WCF Data Services eignet sich daher hervorragend, wenn Sie Daten mit Beziehungen haben, insbesondere wenn Sie SQL Server und Entity Framework verwenden. Sie können schnell abfragbare Daten + Aktionen (Aufrufe zum Aufrufen von Vorgängen, dh Workflows, Hintergrundprozesse) über REST mit sehr wenig Code verfügbar machen. WCF Data Services wurde gerade aktualisiert. Neue Version gestartet. Schauen Sie sich alle neuen Funktionen an.
Der Nachteil von WCF Data Services ist die "Kontrolle", die Sie über den HTTP-Stack verlieren. Ich fand den größten Fehler in den IQueryable<T>
Methoden, die Sammlungen zurückgeben. Im Gegensatz zu RIA Services UND WebApi haben Sie KEINEN vollständigen Zugriff, um die Logik in der IQueryable-Methode zu entwickeln. In RIA Services und WebApi können Sie jeden gewünschten Code schreiben, solange Sie zurückkehren IQueryable<T>
. In WCF Data Services erhalten Sie NUR Zugriff auf das Anhängen einer "Where" -Anweisung mithilfe von Expression<Func<T,bool>>
Interceptor-Methoden. Ich fand das enttäuschend. Unsere aktuelle Anwendung verwendet RIA Services und ich finde, wir brauchen wirklich die Fähigkeit, die IQueryable-Logik zu steuern. Ich hoffe ich irre mich und ich vermisse nur etwas
Außerdem unterstützt WCF Data Services noch NICHT alle LINQ-Operatoren vollständig. Es unterstützt jedoch immer noch mehr als WebApi.
Was ist mit WebApi ???
- Ich mag die Kontrolle über HTTP-Anfrage / Antwort
- Es ist einfach zu befolgen (Nutzung von MVC-Mustern). Ich bin sicher, dass weitere Werkzeuge kommen werden.
Nach meinem Verständnis gibt es derzeit keine Unterstützung für "Datenkontext" auf dem Client (z. B. Silverlight, serverseitiger ASP.NET-Code usw.), da es in WebApi nicht wirklich um Entitätsdatenmodelle wie WCF Data Services / OData geht ist. Es kann Sammlungen von Modellobjekten mit IQueryable / IEnumerable verfügbar machen, es gibt jedoch keine "Navigationseigenschaften" für Primärschlüssel / Fremdschlüssel (dh Kundenrechnungen), die verwendet werden können, sobald die Entitäten auf den Client geladen wurden, da kein "Datenkontext" vorhanden ist. Dadurch werden sie asynchron geladen (oder in einem Aufruf mit $ expand) und die Änderungen verwaltet. Sie haben keine codegenerierte "Darstellung" Ihres Entitätsdatenmodells auf dem Client, wie dies bei RIA Services oder WCF Data Services der Fall ist. Ich sage nicht, dass Sie keine Modelle im Client haben können, die Ihre Daten darstellen. Sie müssen die Daten jedoch manuell ausfüllen und verwalten, welche "Rechnungen" mit jedem "Kunden" festgelegt werden sollen, sobald sie über das Web abgerufen werden. Dies kann schwierig werden, insbesondere bei all den Async-Dingen. Sie wissen nicht, welche Anrufe zuerst zurückkommen. Dies mag hier schwer zu erklären sein, aber lesen Sie einfach über den "Datenkontext" in RIA Services oderWCF-Datendienste . Wenn ich mich also mit Branchen-Apps beschäftige, ist dies für mich ein großes Problem. Dies basiert hauptsächlich auf Produktivität und Wartbarkeit. Sie können Apps ohne Datenkontext veraltet erstellen. Dies erleichtert die Arbeit, insbesondere in Silverlight, WPF und jetzt in Windows 8 Metro. Es ist wirklich schön, relationale Entitäten asynchron in den Speicher zu laden und zwei Bindungen zu haben.
Bedeutet dies jedoch, dass WebApi eines Tages einen "Datenkontext" auf dem Client unterstützen kann? Ich denke es könnte. Mit mehr Tools könnte ein Visual Studio-Projekt auch alle Ihre CRUD-Methoden basierend auf einem Datenbankschema (oder Entity Framework) generieren.
Ich weiß auch, dass ich .NET gegenüber .NET Frameworks nur erwähne, wenn es um die Arbeit mit WCF Data Services oder WebApi geht, aber ich bin mir sehr bewusst, dass HTML / JS auch ein wichtiger Akteur ist. Ich habe nur die Vorteile erwähnt, die ich beim Umgang mit einer Silverlight-Benutzeroberfläche oder einem serverseitigen ASP.NET-Code usw. gefunden habe. Ich glaube, dass mit dem Aufkommen von "IndexedDB" in HTML5 / JavaScript ein "Datenkontext" und ein " Das LINQ-Framework in JavaScript könnte ebenfalls verfügbar werden, wodurch die Abfrage von OData Services über JavaScript noch einfacher wird (Sie können DataJS heute mit OData verwenden). Wenn Sie KnockoutJS verwenden, um MVVM und Binding auch in HTML / JS zu unterstützen, wird dies zu einem Kinderspiel :)
Ich recherchiere derzeit, welche Plattform ich verwenden soll. Ich würde beides gerne verwenden, aber ich neige dazu, mich auf OData zu stützen, da meine nächste Anwendung in erster Linie Analytics (schreibgeschützt) betrifft und ich eine ausdrucksstarke RESTful-API möchte. Ich glaube, OData + WCF Data Services gibt mir das, weil WebApi nur $ take, $ skip, $ filter, $ orderby over Collections unterstützt. Projektionen, Includes ($ expand) usw. werden NICHT unterstützt. Ich habe nicht viele "Updates / Deletes / Inserts" und unsere Daten sind ziemlich relational.
Ich hoffe, dass andere an der Diskussion teilnehmen und ihre Gedanken äußern. Ich entscheide mich immer noch und würde gerne andere Meinungen hören. Ich denke wirklich, dass beide Frameworks großartig sind. Ich frage mich, ob Sie sich überhaupt entscheiden müssen, warum Sie bei Bedarf nicht beide verwenden. Vom Client aus geht es sowieso nur darum, REST-Aufrufe zu erstellen. Nur ein Gedanke :)