Quel est le moyen le plus simple de convertir un fournisseur ODATA de services de données WCF en API Web?

StackOverflow https://stackoverflow.com/questions/19825159

Question

Je regarde actuellement la faisabilité de convertir notre fournisseur ODATA de services de données WCF actuels en API Web ODATA.

Je suis juste un peu confus lors de l'implémentation ODATA pour l'API Web. Avec les services de données WCF, il se trouve au-dessus de notre modèle d'entité ADO.NET qui expose un tas de tables du backend SQL Server, c'est-à-dire que vous donnez à WCFDS le modèle ADO à générer, puis vous avez accès à toutes les tableaux via la norme Syntaxe Odata.

Avec l'API Web de toute la lecture jusqu'à présent, créons-nous un contrôleur ou des actions séparées pour chaque table / objet que nous voulons exposer? Est-ce que je manque quelque chose? Existe-t-il juste un moyen où le contrôleur API Web Odata peut simplement exposer l'ensemble du modèle à partir du modèle de données ADO? Devoir créer une action pour chaque table serait un gâchis et une exagération.

Actuellement, si nous devons ajouter un tableau, nous le mapperons simplement dans l'EDMX et WCFDS l'exposera automatiquement car il est mappé à l'ensemble du contexte du modèle.

Était-ce utile?

La solution

Générer le ou les modèles (s)

Tu peux:

  • Utilisez le Convention Builder de l'API Web ASP.NET. Cela génère un modèle différent de ce que produit le fabricant de modèles de congrès d'EF: un edmlib IEdmModel. Voir cette question Mais si vous utilisez un modèle-premier ou une base de données. Cette méthode semble vraiment en arrière, et elle l'est, mais elle fonctionne surtout.
  • Sérialiser le modèle EF et le reconstruire comme un IEdmModel (voir cette question). Encore une fois, c'est vraiment inefficace. Si vous utilisez Model-First ou Database-First, vous voudrez simplement désérialiser le fichier EDMX pour créer le IEdmModel. Il produit toujours un modèle différent en interne, mais au moins le CDSL est un format plus stable que les conventions de code CLR, vous aurez donc probablement moins de surprises que vous n'auriez que lorsque vous utilisez deux constructeurs de modèles basés sur des congrès différents.

La raison en est que les extensions ASP.NET Web API Odata utilisent Edmlib, tandis que EF utilise son propre code, et Il n'est pas prévu de les faire travailler ensemble. Peut-être que vous trouverez cette diatribe utile si vous êtes curieux.

Travailler sur l'API

Une fois que vous avez généré le modèle à partir d'une source unique (afin que vous puissiez travailler sur votre modèle à partir d'un seul endroit), vous devrez en effet créer un contrôleur par entité, en gros. Le but de l'API Web n'est pas de construire des choses automatiquement, mais d'offrir de la flexibilité au développeur. La EntitySetController Aide à réduire la redondance, mais il n'offrira pas tout hors de la boîte.

Prendre du recul

Dans la diatribe mentionnée ci-dessus, je parle également de la différence entre un couche de service API et un couche de données API. L'API Web ASP.NET est mieux adaptée aux services, tandis qu'Odata rend les services gênants. D'un autre côté, Odata rend l'accès aux données un jeu d'enfant (étant essentiellement comme un SQL reposant) et, en raison d'être directement attaché au modèle de données, peut automatiser beaucoup de choses comme vous l'avez vu avec les services de données WCF. L'API Web ASP.NET avec des extensions ODATA se trouve au milieu, et sa valeur n'est pas universellement convenu (l'utilisation de certains bits de la syntaxe ODATA URI sur les API de service est certainement utile cependant).

Ne soyez pas trop excité par le récent buzz autour de l'API Web ASP.NET, les services de données informatiques et WCF sont des bêtes très différentes et exécutent sur différentes couches dans votre conception. En effet, dans une architecture à plusieurs niveaux, vous pourriez très bien voir une API de service construite à l'aide de l'API Web ASP.NET assis au-dessus d'une API ODATA construite à l'aide de services de données WCF.

Mon conseil est de réfléchir attentivement à ce que vous essayez de construire, et en fonction de la réponse, choisissez ASP.NET Web API et adoptez le fait que l'API que vous exposez sera très différente d'une API Odata centrée sur les données, ou Stick avec WCF Data Services.

Un plan possible

Vous pouvez trouver beaucoup de matériel sur le Web sur les API de service de service sur le Web en recherchant des termes tels que "API Web non crud / RESTFul / Hypermedia" ou en comparant des produits comme ServiceStack, qui plaident pour des API moins orientées données.

Si vous n'êtes toujours pas sûr de la nature de votre projet, prototype.

  • Si vous vous retrouvez avec un tas de contrôleurs essentiellement identiques avec API Web, chacun est cartographié sur une seule entité, votre API est fortement orientée vers les données. Aller avec les services de données WCF.
  • Si vous vous retrouvez avec de nombreuses actions ODATA et des entités maladroites avec les services de données WCF, vous avez besoin de plus de logique de domaine sur le côté du serveur de l'API, et l'orientation des données ne vous offre pas assez. Aller avec l'API Web. Une bonne règle d'or ici est de traiter les actions ODATA, tout comme vous traitez les procédures stockées dans un SDBM SQL. En fait, traitez n'importe quel serveur ODATA comme un SGBD, car c'est ce qu'ils sont. Si vous ne le mettez pas derrière une interface SQL, ne le mettez pas derrière une interface Odata.

Important (mise à jour)

Il a été annoncé le 27 mars 2014 que les services de données WCF seraient interrompu par Microsoft en faveur de l'API Web ASP.NET. Pour gérer les cas d'utilisation de la "couche de données" que j'ai exposés ici, Microsoft a déclaré qu'il prévoyait d'étendre l'API Web ASP.NET. Quelques communauté efforts sont également en cours. Les services de données WCF seront également ouverts à un moment donné, il n'est donc pas impossible qu'un nouveau maintienneur soit rachué, bien qu'il soit incertain.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top