2013-04-14 7 views
18

Sto per creare una semplice app Web e mi chiedo se dovrei utilizzare la nuova funzionalità ASP.NET MVC 4 Web API.Come combinare Web Api e MVC migliori in una singola app Web

Qual è il modo migliore per farlo?

Ho fatto alcune ricerche e ho trovato fuori ci sono due possibilità:

Option 1

rendere il Web Api mio servizio di livello e lo chiamano dal controller di leggere/scrivere dati, e rendere il guarda usando i modelli di vista e il rasoio.

Option 2

rendere lo strato mio servizio Web Api e chiamarlo direttamente dalla visualizzazione utilizzando Javascript.

Non sono un grande fan di Option 2 poiché ritengo di trascurare il controller che verrà utilizzato solo per il reindirizzamento tra le pagine. Inoltre preferisco usare il rasoio piuttosto che Javascript.

E se scelgo Option 1 dovrò creare un'istanza di un'API Web nel controller? perché mi sembra che sto facendo qualcosa di sbagliato.

Qual è l'opzione migliore? C'è qualche altra opzione che non ho considerato?

E se puoi dare qualche riferimento o libro che possa aiutarmi, lo apprezzerei.

Grazie.

+1

Vorrei scegliere l'opzione più semplice, con l'opzione 2 che sembra essere la più semplice delle due opzioni presentate. – Kane

risposta

15

Di solito ho un altro livello (che può essere un progetto/assieme diverso a seconda delle dimensioni e della complessità dell'applicazione) per le mie regole aziendali . Puoi chiamare questo servizio commerciale o qualsiasi altra cosa sul tuo caso.

Quindi entrambi controller MVC e controllori API usare questo livello; che mantiene l'applicazione asciutta.

Personalmente preferisco mantenere solo operazioni complesse nei miei livelli aziendali, il che significa che se devo leggere qualcosa dal mio livello di persistenza da visualizzare nelle mie viste, lo faccio direttamente sul controller MVC. Questa è una questione di preferenze personali, ma preferisco andare al modo CQRS.

Così i controller MVC realizzeranno questi servizi aziendali (o verranno iniettati nei controller se si sta utilizzando IoC). Per le operazioni di lettura è possibile scegliere di passare direttamente al livello di persistenza o utilizzare un'altra strategia di lettura.

Lo stesso accadrà ai controller API, utilizzeranno questo livello "comune" di servizi.

Non è necessario creare un'istanza dei controller API sui controller MVC. Consumare i controller Web Api tramite AJAX è ok se si sta sviluppando una SPA o simili.

Non esiste un unico modo per strutturare l'applicazione, ci sono solo modi diversi e ognuno ha più o meno dolore collegato.

Se state pensando di introdurre test nelle vostre applicazioni (e dovreste :)); allora dovresti strutturarlo in modo che sia facile testarne ogni parte.

Solo i miei 2 centesimi.

+0

Grazie Raciel, penso che sia meglio usare i controller MVC quando carico la pagina dei fori e quindi utilizzare i controller API tramite Ajax su operazioni di piccole dimensioni che non richiedono caricamento – kbaccouche

+0

CQRS dice solo che un metodo dovrebbe restituire informazioni (query), oppure eseguire alcune azioni che cambiano lo stato (comando), e non entrambe. Tuttavia, c'è un po 'più di quello. In entrambi i casi, non dice nulla o supporta l'accesso diretto alla persistenza da un servizio (che dovrebbe essere solo un wrapper per esporre la logica di business). – Suamere

4

L'intero punto dell'API Web deve essere un servizio RESTful stateless. Non ci sarebbe mai un caso se lo stai facendo bene. Mi rendo conto che questa domanda è vecchia e potresti averlo imparato personalmente, ma la risposta non è tanto per te quanto è una risposta a una domanda frequente.

Nota che quando si parla di API Web, il più delle volte, si parla di ApiControllers e non di "Controller" MVC di base che eseguono percorsi e li trasformano in Visualizzazioni.

Quindi nel tuo progetto, potresti avere alcuni "Controller" che eseguono alcune logiche di visualizzazione di base, ma nessuna logica di business. Non confondetelo con il vostro Service Layer, che è un wrapper per l'accesso alla vostra Business Logic e alla Persistenza.

Io e molti, sono dell'opinione che ApiControllers non debba essere mescolato con l'applicazione MVC. Tieni presente che MVC non si integra bene con l'API Web. Come Filip W dice:

Molti dei concetti utilizzati da API Web e MVC, anche se simile a prima vista, non sono in realtà compatibili. Ad esempio, gli attributi API Web sono attributi System.Web.Http.Filters.Filter e MVC sono System.Web.Mvc.Filter - e non sono intercambiabili.

risposta più flessibile

Quindi, ciò che si fa è creare un sottodominio di nome api.YourWebsite.com, e costruire un nuovo progetto ApiController Web API lì. Quel progetto di API Web dovrebbe fare NIENTE più che creare un'istanza ed esporre Business Logic tramite ApiControllers e Iniezione di Dipendenza.

Alternativa 1

Service-Oriented Architecture è tutto riutilizzabilità. Se vuoi mantenere le tue applicazioni ASCIUTATE, devi assolutamente cadere in SOA. Però, ogni situazione è diversa. Se non utilizzerai mai la stessa logica di business in questo sito Web in nessuna altra applicazione (desktop, android, tablet, ewphone, ecc.), Allora hai un metodo alternativo.

Crea il tuo livello logico Busines come progetto diverso e accedi direttamente alla tua app Web. Quando i tuoi controller Javascript (Angular/Razor?) Effettuano una chiamata, possono chiamare i tuoi ViewModels e/o Codebehind o qualcosa di simile, che può creare un'istanza di Business Logic e accedervi direttamente. Non c'è bisogno di servizi se tutto è giusto e non verrà riutilizzato.

Alternativa 2

Vai avanti e mettere le ApiControllers Web API nello stesso progetto. Ma, assicurati di separarli in cartelle diverse dal tuo MVC "Controller". Tuttavia, quando i tuoi controller Javascript effettuano una chiamata, effettueranno chiamate di routing sul tuo sito Web per ottenere resi senza stato. Non mescolare gli ApiControllers stateless con ViewModels e altri codici MVC.

Lo svantaggio di questo è una mancanza di SOC.A questo punto, il livello di servizio e il livello dell'interfaccia utente vengono mescolati e il livello dell'interfaccia utente è obbligato ad accedere al livello di business logic (DLL). Cosa c'è di sbagliato in questo se l'alternativa 1 lo ha fatto?

Bene, ciò che è sbagliato è che Alternative 1 era una piccola applicazione senza spazio per la crescita. Qualsiasi altra cosa (il piano originale o Alternativa 2 qui) dovrebbe avere un'interfaccia utente che non ha alcun indizio che Business Logic (o Persistenza) esistano. Dovrebbero andare in giro per i loro doodie inconsapevoli del mondo del backend.