Quando si pianifica l'architettura per un'applicazione web MVC su scala medio-larga, come si implementano gli strati per essere il più possibile disaccoppiati e facili da testare? (in pratica segui le best practice) Supponiamo che sto utilizzando il codice come accesso ai miei dati.
Faccio fatica a definire cosa sia la "logica aziendale" e come si intende interagire con il livello dati. Prendendo ad esempio una domanda di vendita di veicoli, le logiche di business sarebbero classi che eseguivano compiti come il calcolo della banda fiscale per determinati veicoli, confrontando statistiche di miglia per gallone, ecc.? Per quanto riguarda le entità aziendali (ad esempio Cars, Vans, Motorcycles), inserirò queste informazioni nel livello dati insieme alla mia classe datacontext.
Inoltre, ciò che costituirebbe una logica applicativa piuttosto che business - indovinerò cose come le convalide di sessione / input dell'utente?
Quindi, ad esempio, un controller per auto potrebbe restituire un risultato azione / vista che elenca le prime dieci vetture filtrate per tipo e miglior mpg. Quindi diciamo che ho un 'carRepo' di ICarRepository iniettato nel mio controller (usando il pattern di repository / DI), filtro le mie auto da un parametro del metodo action, ad es. var cars = carRepo.getCarsByType ("hatchback");
Quindi ho mantenuto la conoscenza dell'accesso ai dati dal mio controller utilizzando un repository, ora per mantenere la logica aziendale fuori dal controller usando un modello di dominio - var result = new MpgCalculator (cars); - Diciamo che ho bisogno della classe calcolatrice perché ha bisogno di eseguire una logica aggiuntiva per calcolare la migliore efficienza del carburante, più che caricare e filtrare le entità dal DB. Così ora ho un set di dati per la mia vista per eseguire il rendering che ha utilizzato un repository per recuperare dal livello di accesso ai dati e oggetto specifico del dominio per elaborare ed eseguire attività correlate all'attività su quei dati.
Sto facendo degli errori qui? abbiamo ancora bisogno di usare il modello di repository o posso semplicemente codificare un'interfaccia per disaccoppiare l'ORM e testare? Su questo argomento, dal momento che le mie classi di accesso ai dati concreti dbcontext si trovano nel livello dati, le definizioni dell'interfaccia devono essere inserite nel livello dominio / azienda, il che significa che se la tecnologia di accesso ai dati viene mai modificata, gli altri livelli non vengono modificati?
Da quanto ho studiato fino ad ora la mia struttura si presenta così:
MVC Internet Application - Il progetto Internet standard - i modelli qui sono ViewModels
Dominio / Livello aziendale - classi / modelli specifici del business che i controllori possono utilizzare per elaborare entità di dominio dal livello dati prima di passare alle viste pertinenti
L'astrazione del deposito è necessaria? - Ho sentito un sacco di discussioni su questo, soprattutto quando si utilizza un ORM
Livello dati - Classi entità (Auto, Furgone, Motocicletta), DbContext - Strato di tecnologia per l'accesso ai dati concreti
Chiedo scusa se i miei esempi non hanno senso, sto cercando di imparare i migliori schemi senza rendere le applicazioni inutilmente complicate!