Ho avuto una discussione accesa oggi sulla nostra applicazione MVC. Abbiamo un sito Web scritto in MVC ( ASP.NET ) e di solito segue lo schema di fare qualcosa nella vista -> premi il controller -> il controller crea un modello (chiama un Manager che ottiene i dati, costruisce il modello nel metodo di controllo stesso) -> il modello visualizza -> risciacqua e ripeti.
Ha detto che il nostro codice era troppo stretto. Ad esempio, se volessimo anche un'applicazione desktop, non saremmo in grado di utilizzare il nostro codice esistente.
La soluzione e le migliori pratiche che ha detto è quella di creare un'API, quindi costruire il tuo sito Web in cima all'API e quindi creare un'applicazione desktop, un'app mobile, ecc. È molto semplice.
Questa mi sembra una cattiva idea per vari motivi.
Ad ogni modo, non riesco a trovare nulla su Google che possa discutere di questa pratica. Qualcuno ha qualche informazione su pro, contro, perché dovresti, perché non dovresti o leggere ulteriormente?
Alcuni motivi penso che sia una cattiva idea:
È troppo astratto per eseguire il back-end da un'API. Stai cercando di renderlo troppo flessibile, il che lo renderà un casino ingestibile.
Tutto il materiale integrato in MVC sembra inutile, come ruoli e autenticazione. Ad esempio, [Autorizza] attributi e sicurezza; dovrai tirare il tuo.
Tutte le tue chiamate API richiederanno informazioni sulla sicurezza allegate e dovrai sviluppare un sistema token e quant'altro.
Dovrai scrivere chiamate API complete per ogni singola funzione che il tuo programma potrà mai svolgere. Praticamente ogni metodo che si desidera implementare dovrà essere eseguito da un'API. Un Get / Update / Delete per ogni utente, oltre a una variante per ogni altra operazione, ad esempio aggiornare il nome utente, aggiungere l'utente a un gruppo, ecc. Ecc. E ognuno sarebbe una chiamata API distinta.
Perdi tutti i tipi di strumenti come interfacce e classi astratte quando si tratta di API. Roba come WCF ha un supporto molto debole per le interfacce.
Hai un metodo che crea un utente o esegue alcune attività. Se vuoi creare 50 utenti, puoi semplicemente chiamarlo 50 volte. Quando decidi di utilizzare questo metodo come API il tuo webserver locale può connettersi ad esso e senza problemi: anche il tuo client desktop può colpirlo, ma all'improvviso la creazione di utenti in blocco comporterà il martellamento dell'API su Internet 50 volte che non è va bene. Quindi devi creare un metodo di massa, ma in realtà lo stai solo creando per i client desktop. In questo modo, devi finire per a) modificare la tua API in base a ciò che si integra con essa e non puoi semplicemente integrarti direttamente con essa, b) fare molto più lavoro per creare una funzione extra.
YAGNI . A meno che non si stia pianificando in particolare di scrivere due applicazioni funzionanti in modo identico, ad esempio un'applicazione Web e un'applicazione Windows, si tratta di un'enorme quantità di lavoro di sviluppo aggiuntivo.
Il debug è molto più difficile quando non è possibile passare da un capo all'altro.
Molte operazioni indipendenti che richiederanno molto avanti e indietro, ad esempio alcuni codici potrebbero ottenere l'utente corrente, verificare che l'utente abbia il ruolo di amministratore, ottenere la società di appartenenza dell'utente, ottenere un elenco di altri membri, inviarli tutti un'email. Ciò richiederebbe molte chiamate API o la scrittura di un metodo su misura dell'attività specifica desiderata, in cui l'unico vantaggio di tale metodo su misura sarebbe la velocità, ma il rovescio della medaglia sarebbe che sarebbe inflessibile.
Probabilmente alcuni altri motivi per cui questi sono appena fuori dalla mia testa.
Mi sembra solo se non hai davvero bisogno di due applicazioni identiche, quindi non ne vale davvero la pena. Non ho mai visto un'applicazione ASP.NET costruita in questo modo, dovresti scrivere due applicazioni separate (l'API e il tuo codice) e controllare anche la versione di entrambe (se la tua pagina utente ottiene un nuovo campo, " devo aggiornare contemporaneamente l'API e il tuo codice utente per garantire l'assenza di effetti negativi o dedicare molto lavoro extra per mantenerlo robusto).
Modifica: alcune ottime risposte, iniziando davvero ad avere una buona idea di cosa significhi tutto questo ora. Quindi, per espandere la mia domanda, come struttureresti un'app MVC per seguire questa struttura API?
Ad esempio, hai un sito Web che visualizza informazioni su un utente. Sotto MVC, hai:
Visualizza: pagina (CS) HTML che visualizza un controller UserViewModel: chiama GetUser () e crea un UserViewModel che passa alla classe view manager (ordinamento dell'API) con un metodo GetUser.
Il controller esegue GetUser () ma vuoi anche un'app desktop. Ciò significa che GetUser deve essere esposto tramite un qualche tipo di API. È possibile che si desideri una connessione TCP, WCF o Remoting. Vuoi anche un'app mobile che sia RESTful poiché le connessioni persistenti sono instabili.
Quindi scriveresti un'API per ognuno di essi, un servizio Web WCF che ha un metodo GetUser () e il codice lo fa return new UserManager().GetUser()
? E un metodo api mvc 4 web che fa la stessa cosa? Continuando a chiamare GetUser direttamente nel metodo del controller MVC?
O sceglieresti la soluzione che funzionerebbe per tutti e tre (servizio REST di api Web) e basarti su tutto, quindi tutte e tre le app effettuano chiamate API (quelle mvc, al computer locale).
E questo è solo uno scenario teoricamente perfetto? Riesco a vedere grandi spese generali nello sviluppo in questo modo, soprattutto se devi svilupparti in un modo che ti permetta di eseguire le operazioni in modo RESTful. Penso che parte di questo sia stato trattato nelle risposte.
Modifica 2: Dopo aver letto più cose, ho inserito un commento sotto che penso possa spiegarlo. La domanda è un po 'una domanda trabocchetto, penso. Se dovessi scrivere il tuo back-end come un'API mi ha fatto confondere pensando che ci dovrebbe essere un unico servizio web che tutto (app mvc, app desktop, app mobile) chiama per fare cose.
La conclusione a cui sono giunto è che ciò che dovresti davvero fare è assicurarti che il tuo livello di logica aziendale sia correttamente disaccoppiato. Guardando il mio codice, lo faccio già: il controller chiamerà GetUser()
un manager, quindi creerà un modello di visualizzazione da renderizzare con una vista. Quindi, davvero, il livello di logica aziendale è un'API. Se vuoi chiamarlo da un'app desktop, devi scrivere qualcosa come un servizio WCF per facilitare la chiamata. Anche solo avere un metodo WCF chiamato GetUser()
che contiene il codice return MyBusinessLayer.GetUser()
sarebbe sufficiente. Quindi l'API è la logica aziendale e WCF / API Web ecc. Sono solo titoli di codice per consentire alle applicazioni esterne di chiamarlo.
Quindi c'è un sovraccarico, nel senso che devi avvolgere il tuo livello di logica aziendale in diverse API a seconda di ciò che ti serve, e dovrai scrivere un metodo API per ogni operazione che vuoi che facciano le altre tue app, inoltre dovrai risolvere un modo per fare l'autenticazione, ma per la maggior parte è lo stesso. Incolla la tua logica di business in un progetto separato (libreria di classi) e probabilmente non avrai problemi!
Speriamo che questa interpretazione sia corretta. Grazie per tutte le discussioni / i commenti che ha generato.