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.
Vorrei scegliere l'opzione più semplice, con l'opzione 2 che sembra essere la più semplice delle due opzioni presentate. – Kane