Frage

Ich betrachte derzeit die Machbarkeit, unseren aktuellen WCF Data Services ODATA -Anbieter in Web -Api Odata umzuwandeln.

Ich bin nur ein wenig verwirrt über die ODATA -Implementierung für Web -API. Mit WCF Data Services befindet sich es über unserem ADO.NET -Entitätsmodell, das eine Reihe von Tabellen aus dem SQL -Server -Backend enthüllt, dh Sie geben WCFDS das ADO Odata -Syntax.

Erstellen wir mit Web -API von allen Lesen bisher einen Controller oder separate Aktionen für jede Tabelle/jedes Objekt, die wir freilegen möchten? Vermisse ich etwas? Gibt es nur einen Weg, in dem der ODATA -Web -API -Controller das gesamte Modell aus dem ADO -Datenmodell freilegen kann? Eine Aktion für jeden Tisch erstellen zu müssen, wäre ein Chaos und ein Overkill.

Wenn wir derzeit eine Tabelle hinzufügen müssen, haben wir sie einfach in den EDMX abbilden, und WCFDs enthüllen sie automatisch, da sie dem gesamten Kontext des Modells zugeordnet ist.

War es hilfreich?

Lösung

Erzeugen der Modell (en)

Du kannst:

  • Verwenden Sie das Convention Model Builder Von ASP.NET Web API. Dies erzeugt ein anderes Modell als das, was EFs eigenes Kongressmodellbuilder erzeugt: ein EDMLIB IEdmModel. Sehen diese Frage Wenn Sie jedoch Modell-First- oder Datenbank-First verwenden. Diese Methode scheint wirklich rückwärts zu sein, und sie ist es, aber sie funktioniert meistens.
  • Serialisieren Sie das EF -Modell und bauen Sie es als eine wieder auf IEdmModel (sehen diese Frage). Auch dies ist wirklich ineffizient. Wenn Sie Modell-First- oder Datenbank-First verwenden, möchten Sie die EDMX-Datei nur deserialisieren, um die zu erstellen IEdmModel. Es produziert immer noch ein anderes Modell intern, aber zumindest das CDSL ist ein stabileres Format als CLR-Codekonventionen. Sie werden also wahrscheinlich weniger Überraschungen haben als Sie erhalten, wenn Sie zwei verschiedene Kongressbasis-Modellbauer verwenden.

Der Grund dafür ist, dass ASP.NET -Web -Api -Erweiterungen EDMLIB verwenden, während EF seinen eigenen Code verwendet und Es gibt keinen Plan, um sie zusammenzuarbeiten. Vielleicht wirst du es finden Dieser Scherz Nützlich, wenn Sie neugierig sind.

Arbeiten an der API

Sobald Sie das Modell aus einer einzigartigen Quelle generiert haben (damit Sie von einem einzelnen Ort von Ihrem Modell aus arbeiten können), müssen Sie im Grunde genommen einen Controller pro Entität erstellen. Der Punkt der Web -API besteht nicht darin, Dinge automatisch zu erstellen, sondern dem Entwickler Flexibilität zu bieten. Das EntitySetController Hilft bei der Reduzierung der Redundanz, aber es bietet nicht alles außerhalb der Schachtel.

Einen Schritt zurücktreten

In der oben genannten Rant spreche ich auch über den Unterschied zwischen a Service-Schicht API und a Datenschicht API. Die ASP.NET -Web -API ist besser für Dienste geeignet, während Odata Dienste unangenehm macht. Andererseits macht ODATA Daten zu einem Kinderspiel (im Wesentlichen wie ein erholsamer SQL) und kann aufgrund der direkten Anleihe an das Datenmodell eine Menge Dinge automatisieren, wie Sie es mit WCF -Datendiensten gesehen haben. Die ASP.NET -Web -API mit ODATA -Erweiterungen befindet sich in der Mitte, und sein Wert ist nicht allgemein vereinbart (unter Verwendung bestimmter Teile der Odata -URI -Syntax auf Service -APIs ist jedoch sicherlich nützlich).

Lassen Sie sich nicht zu sehr von der jüngsten Begeisterung um ASP.NET -Web -API und WCF -Datendienste auswirken. In einer mehrstufigen Architektur könnten Sie sehr gut eine Service-API sehen, die mit der ASP.NET-Web-API erstellt wurde, die auf einer mit WCF-Datendiensten erstellten ODATA-API sitzt.

Mein Rat ist sorgfältig darüber nachzudenken, was Sie erstellen möchten, und je nach der Antwort wählen Sie entweder die ASP.NET-Web-API und nehmen Sie die Tatsache an mit WCF -Datendiensten.

Ein möglicher Plan

Im Internet finden Sie im Web viel Material über Service-Layer-APIs im Internet, indem Sie nach Begriffen wie "Nicht-Crud-Web/RESTful/Hypermedia-API" suchen oder Produkte wie Servicestack vergleichen, die sich für weniger datenorientierte APIs einsetzen.

Wenn Sie sich über die Art Ihres Projekts immer noch nicht sicher sind, Prototype es.

  • Wenn Sie mit einer Web-API eine Reihe von im Wesentlichen identischen Controllern haben, die jeweils genau einer Entität zugeordnet sind, ist Ihre API stark datenorientiert. Gehen Sie mit WCF -Datendiensten.
  • Wenn Sie viele ODATA-Aktionen und unangenehme Entitäten mit WCF-Datendiensten haben, benötigen Sie mehr Domänenlogik auf der Serverseite der API, und die Datenorientierung bietet Ihnen nicht genug. Gehen Sie mit Web -API. Eine gute Faustregel hier ist die Behandlung von ODATA -Aktionen, genau wie Sie gespeicherte Verfahren in einem SQL -DBMS behandeln. Behandeln Sie tatsächlich einen ODATA -Server als DBMS, denn das sind sie. Wenn Sie es nicht hinter eine SQL -Schnittstelle setzen würden, stellen Sie es nicht hinter eine Odata -Schnittstelle.

Wichtig (Update)

Es wurde am 27. März 2014 bekannt gegeben, dass WCF Data Services sein würden abgesetzt von Microsoft zugunsten der ASP.NET -Web -API. Um die hier aufgedeckten "Data-Layer" -Einnutzungen zu verarbeiten, hat Microsoft bekannt, dass die ASP.NET-Web-API erweitert wird. Etwas Gemeinschaft Bemühungen sind auch im Gange. Die WCF-Datendienste werden auch irgendwann offen gesäubert, sodass es nicht unmöglich ist, dass ein neuer Betreuer übernommen wird, obwohl dies ungewiss ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top