2011-10-15 17 views

risposta

14

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.

+0

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

+0

@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) . –

+0

penso di aver capito, grazie per la spiegazione – Alexander

6

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.

0

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.

1

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.

Problemi correlati