Per i controller e ViewModels, che dovrebbe contenere la maggior parte della logica di business?
Nessuno di quelli.
Ho provato alcuni modi per ottenere il mio ViewModels praticamente contenere tutta la logica di business. Tuttavia, devo avere un argomento nel costruttore del mio ViewModel che prende un'unità di lavoro. E 'questa una buona idea?
imho È una pessima idea. Prima di tutto rompi molti dei principi SOLIDI. Raggruppare tutto il codice nel modello di visualizzazione rende difficile il test. Cosa succede se si desidera utilizzare alcune delle business logic in un'altra vista? Duplicate quel codice?
Qual è la migliore pratica qui?
Torniamo prima al pattern MVC. È una definizione abbastanza ampia, ma sapendo dovrebbe darti un'idea di cosa dovresti piazzare dove.
Il "Modello" in MVC è davvero tutto ciò che viene utilizzato per tirare insieme i dati. Può essere un servizio web, un livello aziendale, repository, ecc.
La vista è tutto il codice che genera l'HTML (poiché stiamo parlando di web).
Il controller deve essere considerato come una colla tra il modello e la vista. Quindi dovrebbe prendere le informazioni dal modello e trasformarlo in qualcosa di utile dalla vista.
Il problema con questa struttura è che è abbastanza facile "perdere" informazioni specifiche del livello nelle altre parti del modello. Quindi Microsoft ha introdotto ViewModels nella loro implementazione di MVC.
In questo modo è possibile rimuovere tutta la logica di rendering dalle viste e inserirla nel ViewModel. Invece di fare questo nella vista:
<span>@(model.Age == 0 ? "n/a" : model.Age)</span>
si inserisce il codice all'interno del ViewModel, invece, e sufficiente chiamare @model.Age
. In questo modo non è necessario duplicare il codice in tutte le viste che utilizzano il modello di visualizzazione.
La risposta alla tua domanda su ViewModel è che dovrebbe contenere solo la logica che viene utilizzata per rendere correttamente le informazioni dal "Modello".
Per quanto riguarda il controller, non inserirò alcuna logica di business. Prima di tutto, rende molto difficile testare la tua logica. Quindi aggiungete più responsabilità ad esso (e facendo così rompere SRP). L'unica logica valida nel controller è prendere le informazioni dal ViewModel e trasformarle in qualcosa utilizzabile dal "Modello" e viceversa.
Spero che risponda alla tua domanda.
Aggiornamento
vorrei creare un progetto separato e aggiungere classi ad esso. Quindi aggiungi un riferimento dal tuo webproject e chiama quelle classi nei controller.
Vorrei anche iniziare a utilizzare l'inversione del contenitore di controllo per ottenere automaticamente quelle dipendenze create per me.
Autofac può sia scoprire i servizi per voi (zero-configurazione) e iniettare se stesso in MVC.
di seguire il modello di interfaccia separato creare i seguenti progetti:
- YourProject.BusinessLayer < - Aggiungi le tue lezioni qui
- YourProject.BusinessLayer.Specification < - Aggiungi si interfacce che definisce il vostro livello di business Qui.
- YourProject.Mvc < - Il progetto MVC.
Il progetto "Specifica" può essere utilizzato per semplificare il test delle cose e facilitare l'implementazione (potrebbero essere solo alcune classi e non necessariamente l'intero livello aziendale). Leggi su "Modello di interfaccia separato"
Buona risposta. Vorrei chiedere dove andrebbe la mia logica aziendale? – TIHan
Leggi il mio aggiornamento. – jgauffin
Grazie. Inizierò a esaminare questo. – TIHan