Ottima domanda! Cerco sempre un modo migliore per strutturare i miei progetti. Ogni punto che sollevi ha valore e dopo aver esplorato una varietà di strutture di soluzioni, devo dire che sono d'accordo con la maggior parte dei commenti qui: non esiste una soluzione perfetta. Alcune cose da porsi di fronte a questo tipo di problema: quanto è complessa questa applicazione? Con quanti sistemi avrò bisogno di integrare - o quanti sistemi dovranno integrarsi con questo sistema? Quanti test ho intenzione di fare? Esiste un team di progettazione / interfaccia utente separato? Dovremo ridimensionare? Cosa costituisce una sessione?
Diamo un'occhiata a un paio di scenari e modi per usare un po 'di ingegneria intelligente per far esplodere le cose (e alcuni trucchi per rendere le cose un po' più facili) ..
Ospitare API e sito Web nello stesso progetto
In questo caso, potresti avere un'unica soluzione con zero o più progetti di livello aziendale e un singolo progetto ibrido MVC / WebAPI (così come altri progetti - utilità, ecc.).
Pro's
Tutto è in un unico posto .. Non c'è bisogno di usare le scarpe in messaggistica complicata (chiamate HttpClient), puoi avere uno stato di sessione condiviso (client e server tramite cookie, sessione InProc / OutOfProc, ecc.), Pool di connessioni, logica condivisa, ecc. La distribuzione non potrebbe essere più semplice.
Con's
Tutto è in un unico posto .. Questa è probabilmente la struttura più monolitica possibile. Non ci sono interfacce chiaramente definite tra i tuoi livelli. Finisci per avere una coesione elevata . Gli sviluppatori pigri eviteranno le interfacce quando si occupano di questo tipo di architettura, il che rende i test un problema enorme. Il ridimensionamento / la localizzazione dell'applicazione sarà difficile.
Usi Userei
questa struttura di progetto per un'applicazione una tantum, interna o semplice. Costruire un sistema rapido per tracciare l'iscrizione al campo da basket presso la Y locale? Questa è la tua architettura!
WebAPI e sito Web in diversi progetti
Tendo a preferire questo caso. Hai un'unica soluzione con uno (o più) progetti MVC e un progetto WebAPI.
Modularizzazione di Pro ! Accoppiamento lasco! Ogni progetto può essere autonomo, testato separatamente e può essere gestito in modo diverso. Ciò consente di implementare più facilmente diverse strategie di memorizzazione nella cache in base alle proprie esigenze. Mantenendo solidi confini tra i diversi sistemi, è possibile stabilire più facilmente contratti che consentono di applicare schemi di utilizzo specifici e ridurre i possibili attriti (leggi: meno bug con meno opportunità di abusare dell'API). Il ridimensionamento è un po 'più semplice in quanto è necessario solo ridimensionare i bit che vedono un carico elevato. Anche l'integrazione diventa un po 'più facile da gestire perché dovrai avere un'idea di come sarà la tua API fin dall'inizio.
La
manutenzione di Con è un po 'più difficile. Più progetti significa che avrai bisogno dei proprietari di progetti / funzionalità per tenere traccia di fusioni, contratti (interfacce), distribuzioni, ecc. Manutenzione del codice, debito tecnico , tracciamento degli errori, gestione dello stato - tutti diventano problemi in quanto potrebbero dover essere implementati in modo diverso sulle tue esigenze. Questi tipi di applicazioni richiedono anche la massima pianificazione e cura man mano che crescono.
Utilizzi
Creazione di un'applicazione che potrebbe avere 100 utenti oggi e 100.000 la prossima settimana / mese? L'applicazione deve inviare notifiche, gestire flussi di lavoro complessi e avere più interfacce (web + app mobile + SharePoint)? Hai un sacco di tempo a disposizione e ami risolvere i puzzle di oltre 5000 pezzi nel weekend? Questa è l'architettura per te!
Suggerimenti
Dopo aver delineato quanto sopra, posso capire come il tuo prossimo progetto potrebbe sembrare un po 'scoraggiante. Nessun problema, ecco alcuni trucchi che ho imparato negli anni ..
- Prova a usare sessioni senza stato. Su sistemi più piccoli, ciò potrebbe significare la memorizzazione di un cookie crittografato contenente almeno l'ID interno dell'utente corrente e un timeout. Sistemi più grandi potrebbero significare la memorizzazione di un cookie crittografato con un semplice ID di sessione che potrebbe essere recuperato da un archivio dati (redis, archiviazione tabelle, DHT , ecc.) Se riesci a memorizzare abbastanza informazioni in modo da non dover colpire il database principale su ogni richiesta ti troverai in un buon posto, ma cerca di mantenere i cookie sotto 1k.
- Tieni presente che probabilmente ci sarà più di un modello. Prova a pensare in termini di modelli e proiezioni (i collegamenti che ho trovato qui erano .. non va bene .. pensa: l'articolo di inventario di un uomo è un elemento pubblicitario di un altro uomo - stessa struttura di base di base, ma viste diverse). Alcuni progetti hanno un modello diverso per ciascun confine logico / concettuale (ovvero utilizzando un modello specifico per la comunicazione con un'API specifica.
- L'API è ovunque! Ogni volta che un oggetto / classe / struttura espone dati o comportamenti, si sta stabilendo un'API. Prestare attenzione a come altre entità o dipendenze utilizzeranno questa API. Pensa a come potresti testare questa API. Considera cosa potrebbe parlare a questa API (altri oggetti tramite codice? Altri sistemi tramite un protocollo?) E come vengono esposti i dati (fortemente tipizzati? JSON? * Tosse * XML?).
- Costruisci per quello che hai, non per quello che immagini che avrai tra due anni. Un'altra risposta fa riferimento a YAGNI : sono assolutamente corretti! Risolvere problemi immaginari rende immaginaria la tua scadenza. Stabilisci obiettivi concreti per le tue iterazioni e raggiungili. Deploy! Un progetto in sviluppo è un progetto con un solo utente - tu!
- YMMV (il tuo chilometraggio può variare). C'è solo un assoluto qui: c'è un problema, stai costruendo una soluzione. Tutto il resto è completamente in aria. Entrambe le soluzioni di cui sopra possono essere un successo sfrenato e un fallimento di succhiare. Dipende tutto da te, dai tuoi strumenti e da come li usi. Percorri leggermente, collega sviluppatore!