Quando si implementa il repository per il database nel progetto ASP.NET MVC, è corretto inserire la logica aziendale in esso o potrebbe essere meglio inserire la logica nella classe controller? O utilizzare un servizio aggiuntivo e classi di supporto per la manipolazione dei dati?Qual è il posto migliore per la logica aziendale in ASP.NET MVC quando si utilizzano i repository?
Qual è il posto migliore per la logica aziendale in ASP.NET MVC quando si utilizzano i repository?
risposta
In definitiva non esiste un luogo perfetto per la logica di business oltre al proprio livello (come parte del livello "Modello"). Spesso puoi farcela con un'implementazione diversa, ma in ogni caso ci sono compromessi.
Il compromesso per la creazione di un altro livello per la business logic è che è necessario incapsulare il codice. Se sei troppo aggressivo, potresti anche ottenere una duplicazione tra le tue entità e il tuo modello di dominio (se la semantica relazionale del tuo DB già si prende cura della tua logica aziendale).
View
La vista è la parte più fragile della vostra applicazione, in quanto è la parte più propensi a cambiare.
È anche molto difficile ottenere correttamente la logica di business, vista la necessità di supportare tutte le varie transizioni dello stato di visualizzazione.
E 'molto noto in questi giorni che basta non fare questo :)
Repository
Il problema qui è uno dei manutenzione e la purezza dell'astrazione. Violare questo può confondere le persone e rendere difficile la manutenzione della tua app.
Da the P of EAA article on the Repository pattern:
un repository media tra gli strati di dominio e di mappatura dei dati, agendo come una raccolta oggetto di dominio in memoria
Un repository è un'astrazione che presenta l'archiviazione dei dati come una raccolta che contiene gli oggetti dominio.
Nessuna logica di dominio deve risiedere in essa. Invece, dovrebbe esistere nei tuoi oggetti di dominio (per definizione, come la tua logica aziendale è tuo dominio).
Fare altrimenti (per fare in modo che il repository esegua il doppio dovere e convalidi anche la logica di dominio) sarebbe una violazione di SRP (Single Responsibility Principle) e sarebbe un odore di codice.
È possibile avere oggetti di dominio di livello superiore che funzionano con raccolte di oggetti di dominio per convalidare la logica di dominio (come le dipendenze all'interno di una raccolta di oggetti, limiti di dimensione, ecc.). Utilizzeranno comunque i repository sotto le copertine per eseguire la memorizzazione/il recupero finale degli oggetti del dominio, in modo che non eseguano il doppio lavoro (quindi non violeranno SRP).
controller
Il controller non è anche un buon posto per mettere la logica di business. Il compito del controllore è mediare tra il controller e il modello.
Il modello è il dominio e il dominio è la logica aziendale.
Enti
potreste considerare di mettere dati di dominio in entità.
Tuttavia, è necessario prestare attenzione quando si accede alle proprietà di navigazione se le entità sono collegate, poiché è possibile attivare query o eccezioni DB involontarie (a seconda che il contesto sia disposto o meno). Anche scollegarli è un problema, poiché distrugge il grafico degli oggetti a meno che non si ricolleghi in modo esplicito gli uni agli altri dopo averli scollegati dal contesto.
Se si creano classi di modelli di dominio separati, è possibile considerare il trattamento di entità solo come DTOs.
Edit: IValidatableObject
ho scoperto solo ora su una funzione di Entity Framework 4.1 che si consiglia di controllare: l'interfaccia IValidatableObject
.
È possibile creare classi parziali delle entità e, nella classe parziale, implementare questa interfaccia. Quando lo fai, Entity Framework chiamerà Validate
al salvataggio, e puoi chiamare Validate
ogni volta che ha senso per farlo.
Questo potrebbe aiutare a evitare di suddividere il modello di persistenza dal modello di dominio in casi aggiuntivi.
si veda questo articolo: http://msdn.microsoft.com/en-us/data/gg193959
Nota a margine: Visite/visualizzare i modelli
Nel caso in cui si sta pensando a questo proposito, vi consiglio di evitare la tentazione di passare entità tornare alla vista. Si romperà in molti casi (ad es. Serializzazione Javascript per memorizzare lo stato di visualizzazione) e causerà query DB non intenzionali in altri casi. Passa invece ai tipi semplici (stringhe, interi, elenchi, hashset, dizionari, ecc.) O costruisci le classi del modello di visualizzazione per passare alla vista.
La logica di business dovrebbe essere presente nel modello di dominio.
Si prega di guardare in questa risposta.
+1; Leggi questo dopo aver postato la mia risposta. Più conciso, anche se lo stesso punto :) –
grazie per il link utile – Alexander
aggiungere un livello di servizio per passare modelli Repository, dove possono essere aggiunti classi servizio corrispondente al controllore. Ad esempio, se si utilizza un UserController e un modello utente, è possibile passare il modello utente alla classe UserService.
Qui il Service Layer può fungere da ponte tra il Repository e il controller in modo che la separazione di Controller e Repository sia ben stabilita.
Secondo me dipende dalla logica di business. La logica è basata sulla convalida delle regole di input e input, in tal caso potrebbe essere meglio essere sul modello. Tuttavia, se si tratta di regole aziendali basate su flussi di lavoro che potrebbero dover essere presenti in un controller, ad esempio, l'utente sceglie l'opzione A e viene reindirizzato a una pagina/modulo diversa rispetto all'opzione B selezionata. Se le regole aziendali hanno a che fare con la persistenza dei dati, potrebbe essere necessario andare nel repository (sembrerebbe strano metterlo lì). Ci sono un sacco di discussioni al riguardo, ma dipende da te o dal punto di vista del tuo team su come la manutenzione e la flessibilità del prodotto finale saranno basate sull'implementazione.
Sono d'accordo con quanto sopra, i responsabili del trattamento non dovrebbero essere responsabili della logica aziendale semplicemente per restituire le viste appropriate. Utilizzo un livello di servizio per fornire la logica aziendale e visualizzare la creazione del modello in modo che un controller passi semplicemente il modello restituito da un servizio a una vista.
Mi assicuro anche che i miei modelli di visualizzazione siano semplici DTO e che il servizio sappia semplicemente come popolare le proprietà in modo appropriato.
- 1. Qual è il posto migliore per segnalare i bug in ASP.NET MVC?
- 2. Dove inserire la manipolazione dei dati e il codice di logica aziendale nell'applicazione ASP.NET MVC?
- 3. Qual è il modo migliore per iniettare i repository in un controller ASP.NET
- 4. Dove posizionare la logica aziendale in Symfony2?
- 5. Schema del repository e logica aziendale
- 6. Qual è la logica dietro il decodificatore url quando si utilizzano le virgolette doppie?
- 7. Il modo migliore per testare i repository che usano DbContext
- 8. Dove si inserisce il "livello della logica aziendale" in un'applicazione MVC?
- 9. La migliore pratica quando si utilizzano websockets?
- 10. Qual è la procedura migliore per mantenere i dettagli utente autenticati in un'applicazione ASP.NET Intranet MVC
- 11. Qual è il modo migliore/più pulito per implementare i test A-B in asp.net mvc?
- 12. qual è la migliore pratica per la restituzione di un errore in asp.net mvc
- 13. Qual è il modo migliore per implementare una ricerca di testo completo per un'applicazione ASP.NET MVC?
- 14. Qual è il posto migliore per iniziare a imparare Qt?
- 15. Quanta logica dovrei inserire i miei metodi di repository quando si utilizza il pattern del repository?
- 16. MVC 3 - Controller e ViewModels - Quale dovrebbe contenere la maggior parte della logica aziendale?
- 17. Logica aziendale e dell'applicazione?
- 18. Esempio di applicazione aziendale per ASP.NET MVC?
- 19. Il modo migliore per creare report in ASP.NET MVC
- 20. Qual è la migliore strategia di implementazione per ASP.NET
- 21. TDD: Qual è la procedura migliore per testare DataAnnotations in ASP.NET MVC 3?
- 22. ServiceStack, dove posizionare la logica aziendale?
- 23. Qual è il modo migliore per gestire gli utenti in ASP.NET MVC
- 24. ASP.NET MVC utilizzando il modello di repository
- 25. Come specificare la posizione della vista in asp.net core mvc quando si utilizzano posizioni personalizzate?
- 26. asp.net mvc Forms Collection quando si invia
- 27. Dove dovrebbe essere posizionata la logica aziendale quando si utilizza Doctrine 2 e Zend Framework
- 28. Buono, modo idiomatico per rifattorizzare la logica aziendale dai controllori
- 29. Qual è il modo migliore per passare alla codifica MVC?
- 30. Qual è la differenza tra ASP.NET e ASP.NET MVC?
grazie per la grande risposta! una domanda: nel caso in cui mettiamo la logica aziendale in classe modello dovremmo pensare a Model come è ViewModel (qualcosa come in WPF)? – Alexander
@Alexander: ci sono alcuni paralleli, sì. Ma non sono sicuro di quali cose pensi quando vedi il termine modello di visualizzazione. Una relazione uno-a-uno non è così comune tra le viste e gli oggetti del modello di dominio come tra le viste e gli oggetti del modello di vista. Ed è molto più comune progettare il tuo modello di dominio per soddisfare le esigenze di più applicazioni (ad esempio utilizzate sia in una GUI Web che in un servizio Web) rispetto a un modello di visualizzazione (solitamente solo una singola app WPF, anche se forse più parti di tale app) . –
penso di aver capito, grazie per la spiegazione – Alexander