Sto costruendo un'architettura come questa: Questi sono i miei layer SW
______________
| |
| Views |
|______________|
______________
| |
|Business Logic|
|______________|
______________
| |
| Repository |
|______________|
Le mie visualizzazioni genereranno il mio codice HTML da inviare all'utente La logica aziendale è dove sono tutte le logiche di business Il repository è un livello per accedere al DB
La mia idea è che il repository utilizzi entità (che sono fondamentalmente la rappresentazione delle tabelle, al fine di eseguire query DB.
Gli strati comunicano tra loro usando Business Objects, ovvero oggetti che rappresentano l'oggetto del mondo reale stesso. Possono contenere regole e metodi aziendali.
Le viste creano / usano DTO, sono fondamentalmente oggetti che hanno le informazioni richieste per essere mostrate sullo schermo. Si aspettano anche questo tipo di oggetto sulle azioni e, prima di chiamare la logica aziendale, creano BO.
Prima domanda: qual è la tua opinione generale su questa architettura?
Ho usato un'architettura simile per alcuni progetti e ho sempre avuto questo problema: Se la mia vista ha questo elenco da mostrare:
Student1, age, course, Date Enrolled, Already paid?
Ha informazioni da diversi BO. Come pensi che si dovrebbe costruire la struttura?
Queste erano le alternative a cui potevo pensare:
- Il livello di visualizzazione può chiamare i metodi per ottenere lo studente, quindi il corso che studia, quindi le informazioni di pagamento . Ciò causerebbe molti accessi al DB e la mia vista avrebbe la conoscenza su come agire per generare queste informazioni. Questo mi sembra sbagliato.
- Potrei avere un "oggetto adattatore", che ha le informazioni richieste (una classe che avrebbe una proprietà Studente, Corso e Pagamento). Ma avrei richiesto un oggetto adattatore per ogni caso simile, questo potrebbe andare molto male per i grandi progetti.
Ancora non mi piacciono. Avresti idee? Come cambieresti l'architettura per evitare questo tipo di problemi?
@Rory: Ho letto il CQRS e non penso che questo sia adatto alle mie esigenze. Come preso da riferimenti di link nel tuo link
Before describing the details of CQRS we need to understand the two main driving forces behind it: collaboration and staleness
Ciò significa: molti attori diversi che usano lo stesso oggetto (collaborazione) e una volta che i dati sono stati mostrati a un utente, gli stessi dati potrebbero essere stati cambiati da un altro attore - è stantio (stoltezza).
Il mio problema è che voglio mostrare le informazioni dell'utente da diversi BO, quindi avrei bisogno di riceverle dal livello di servizio. Come può il mio livello di servizio assemblare e fornire queste informazioni?
Modifica in @AndrewM: Sì, l'hai capito bene, l'idea originale era di avere il livello di visualizzazione per costruire i BO, ma hai un punto molto bello riguardo la creazione del BO all'interno dei livelli aziendali. Supponendo che seguo il tuo consiglio e sposti la logica di creazione all'interno del livello aziendale, la mia interfaccia del livello aziendale conterrebbe i DTO, ad esempio
public void foo(MyDTO object)
Ma per quanto ho capito, il DTO è strettamente accoppiato ad ogni vista, quindi non sarebbe riutilizzabile da una seconda vista. Per poterlo utilizzare, la seconda vista dovrebbe creare un DTO specifico da una vista specifica o dovrei duplicare il codice nel livello aziendale. È corretto o mi manca qualcosa?