Quando si pianifica l'architettura per un'applicazione Web MVC di medie dimensioni, come si implementano i layer per essere il più possibile disaccoppiato e facile da testare? (sostanzialmente seguo le migliori pratiche) Supponiamo che io stia usando il codice prima come accesso ai miei dati.
Faccio fatica con cosa definire "business logic" e come si intende interagire con il livello dati. Prendendo ad esempio un'applicazione di vendita di veicoli, la logica di business sarebbe quella delle classi che eseguivano attività come il calcolo della fascia fiscale per determinati veicoli, il confronto delle statistiche di miglia per gallone ecc.? Per quanto riguarda le entità aziendali (ad esempio automobili, furgoni, motociclette) le inserirò nel livello dati insieme alla mia DataContext
classe.
Inoltre, cosa costituirebbe una logica applicativa in contrapposizione al business - sto indovinando cose come le convalide dell'input della sessione / utente?
Quindi, ad esempio, un controller di auto potrebbe restituire un risultato di azione / visualizzazione che elenca le prime dieci auto filtrate per tipo e miglior mpg. Quindi diciamo che ho un ICarRepository
'carRepo' iniettato nel mio controller (usando il modello repository / DI), filtro le mie auto da un parametro del metodo di azione es.var cars = carRepo.getCarsByType("hatchback");
Quindi ho tenuto la conoscenza dell'accesso ai dati fuori dal mio controller usando un repository, ora per mantenere la logica di business fuori dal controller usando un modello di dominio - var result = new MpgCalculator (auto); - Diciamo che ho bisogno della classe calcolatrice perché deve eseguire una logica aggiuntiva per calcolare la migliore efficienza del carburante, oltre a caricare / filtrare entità dal DB. Quindi ora ho un set di dati per il mio punto di vista per il rendering che utilizzava un repository per recuperare dal livello di accesso ai dati e un oggetto specifico del dominio per elaborare ed eseguire attività correlate a tali dati.
Sto commettendo errori qui? dobbiamo ancora usare il modello di repository o posso semplicemente codificare su un'interfaccia per disaccoppiare l'ORM e testare? Su questo argomento, poiché le mie classi dbcontext di accesso ai dati concreti si trovano nel livello dati, le definizioni dell'interfaccia vanno nel livello dominio / business, il che significa che se la tecnologia di accesso ai dati viene mai modificata, i miei altri livelli non vengono effettuati?
Da quello che ho studiato finora la mia struttura appare così:
Applicazione Internet MVC -> Il progetto Internet standard - i modelli qui sono ViewModels
Dominio / Livello aziendale -> classi / modelli specifici dell'azienda che i controller possono utilizzare per elaborare entità di dominio dal livello dati prima di passare alle viste pertinenti
Astrazione del repository necessaria? -> Ho sentito molti dibattiti su questo, specialmente quando si utilizza un ORM
Livello dati -> Classi di entità (Automobile, Furgone, Motociclo), DbContext - Livello tecnologico di accesso ai dati concreti