Qual è il modo più semplice per convertire un fornitore ODATA di servizi dati WCF in API Web?

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

Domanda

Attualmente sto esaminando la fattibilità di convertire il nostro attuale fornitore ODATA di ODATA di WCF Data Services in Web API Odata.

Sono solo un po 'confuso all'implementazione OData per l'API Web. Con WCF Data Services si trova in cima al nostro modello di entità Ado.Net che espone un mucchio di tabelle dal back -end SQL Server, cioè dai a WCFDS il modello ADO da generare e quindi hai accesso a tutte le tabelle Sintassi di Odata.

Con API Web di tutte le letture finora creiamo un controller o azioni separate per ogni tabella/oggetto che vogliamo esporre? Mi sto perdendo qualcosa? Esiste solo un modo in cui il controller API Web OData può semplicemente esporre l'intero modello dal modello di dati ADO? Dover creare un'azione per ogni tavolo sarebbe un disastro e un overkill.

Attualmente, se abbiamo bisogno di aggiungere una tabella, la mappiamo solo nell'EDMX e WCFDS lo esporrà automaticamente mentre è mappato all'intero contesto del modello.

È stato utile?

Soluzione

Generare i modelli

Puoi:

  • Utilizzare il Convenzione Builder modello dall'API Web ASP.NET. Questo genera un modello diverso da quello che produce Model Builder di EF: un Edmlib IEdmModel. Vedere questa domanda sebbene se si utilizza il modello-primo o il database. Questo metodo sembra davvero all'indietro, e lo è, ma funziona principalmente.
  • Serializzare il modello EF e ricostruirlo come un IEdmModel (vedere questa domanda). Ancora una volta questo è davvero inefficiente. Se stai utilizzando il modello-first o il database, ti consigliamo di deserializzare il file EDMX per creare il IEdmModel. Produce ancora un modello diverso internamente, ma almeno il CDSL è un formato più stabile rispetto alle convenzioni di codice CLR, quindi probabilmente avrai meno sorprese di quelle che otterresti quando usi due diversi costruttori di modelli basati su convenzioni.

La ragione di ciò è che le estensioni API Web ASP.NET utilizzano EdMLIB, mentre EF utilizza il proprio codice e Non c'è piano per farli lavorare insieme. Forse troverai questo rant utile se sei curioso.

Lavorando sull'API

Dopo aver generato il modello da una fonte unica (in modo da poter lavorare sul tuo modello da un singolo posto), dovrai effettivamente creare un controller per entità, fondamentalmente. Il punto dell'API Web non è quello di costruire le cose abilmente, ma di offrire flessibilità allo sviluppatore. Il EntitySetController Aiuta a ridurre la ridondanza, ma non offrirà tutto fuori dalla scatola.

Fare un passo indietro

Nel rant menzionato sopra, parlo anche della differenza tra a strato di servizio Api e a strato di dati API. ASP.NET Web API è più adatta ai servizi, mentre Odata rende i servizi imbarazzanti. D'altra parte, Odata rende l'accesso ai dati un gioco da ragazzi (essenzialmente essendo come un SQL RESTful) e in virtù dell'essere direttamente collegato al modello di dati, può automatizzare molte cose come hai visto con i servizi di dati WCF. ASP.NET Web API con estensioni OData si trova nel mezzo e il suo valore non è universalmente concordato (è certamente utile utilizzare alcuni bit di sintassi dell'URI OData URI sulle API di servizio).

Non essere troppo ipotizzato dal recente ronzio attorno all'API Web ASP.NET, i servizi di dati IT e WCF sono bestie molto diverse ed eseguite su diversi livelli nel tuo design. In effetti, in un'architettura a più livelli, potresti benissimo vedere un'API di servizio creata utilizzando API Web ASP.NET seduta in cima a un'API OData costruita utilizzando WCF Data Services.

Il mio consiglio è riflettere attentamente su ciò che stai cercando di costruire e, a seconda della risposta, scegli l'API Web ASP.NET e abbraccia il fatto che l'API che esponi sarà molto diversa da un'API ODATA incentrata sui dati o Stick con servizi dati WCF.

Un possibile piano

Puoi trovare molto materiale sul Web sulle API a strato di servizio sul Web cercando termini come "API Web non Crud/Resful/Hypermedia" o confrontando prodotti come ServiceStack, che sostengono API meno orientate ai dati.

Se non sei ancora sicuro della natura del tuo progetto, prototipirlo.

  • Se finisci con un mucchio di controller essenzialmente identici con API Web, ciascuno mappato su esattamente un'entità, allora l'API è fortemente orientata ai dati. Vai con WCF Data Services.
  • Se finisci con molte azioni OData e entità imbarazzanti con WCF Data Services, è necessario più logica di dominio sul lato server dell'API e l'orientamento dei dati non ti offre abbastanza. Vai con API web. Una buona regola empirica qui è trattare le azioni ODATA proprio come si tratta le procedure memorizzate in un DBMS SQL. In realtà, tratta qualsiasi server ODATA come un DBMS, perché è quello che sono. Se non lo mettessi dietro un'interfaccia SQL, non metterlo dietro un'interfaccia OData.

Importante (aggiornamento)

È stato annunciato il 27 marzo 2014 che i servizi di dati WCF sarebbero stati interrotto di Microsoft a favore dell'API Web ASP.NET. Per gestire i casi d'uso "a livello di dati" che ho esposto qui, Microsoft ha affermato che sta pianificando di estendere l'API Web ASP.NET. Alcuni Comunità sforzi sono anche in corso. I servizi di dati WCF saranno anche aperti ad un certo punto, quindi non è impossibile che un nuovo manutentore prenda, sebbene sia incerto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top