Ho letto Evans, Nilsson e McCarthy, tra gli altri, e ho compreso i concetti e il ragionamento dietro un design guidato dal dominio; tuttavia, trovo difficile mettere insieme tutti questi elementi in un'applicazione reale. La mancanza di esempi completi mi ha lasciato grattarmi la testa. Ho trovato molti framework e semplici esempi, ma finora non c'è nulla che mostri davvero come costruire una vera applicazione aziendale seguendo un DDD.Collegamento dei punti con DDD
Utilizzando il tipico sistema di gestione degli ordini come esempio, prendere in considerazione la cancellazione dell'ordine. Nella mia progettazione posso vedere un OrderCancellationService con un metodo CancelOrder che accetta l'ordine # e un motivo come parametri. Ha poi per eseguire le seguenti 'passi':
- verificare che l'utente corrente ha l'autorizzazione necessaria per annullare un ordine
- recuperare l'entità dell'Ordine con l'ordine specificato # dal OrderRepository
- Verificare che l'Ordine può essere annullato (il servizio dovrebbe interrogare lo stato dell'Ordine per valutare le regole o l'Ordine deve possedere una proprietà CanCancel che incapsula le regole?)
- Aggiornare lo stato dell'entità dell'Ordine chiamando Order.Cancel (motivo
- Persistenza dell'aggiornamento d Ordine al archivio dati
- Contattare la CreditCardService per ripristinare eventuali spese di carta di credito che sono già stati elaborati
- Aggiungi una voce di controllo per l'operazione
Naturalmente, tutto questo dovrebbe accadere in una transazione e nessuna delle operazioni dovrebbe essere autorizzata a verificarsi in modo indipendente. Quello che voglio dire è che devo annullare la transazione con la carta di credito se annullo l'ordine, non posso annullare e non eseguire questo passaggio. Questo, imo, suggerisce un migliore incapsulamento ma non voglio avere una dipendenza dal CreditCardService nel mio oggetto dominio (Ordine), quindi sembra che questa sia la responsabilità del servizio di dominio.
Sto cercando qualcuno che mi mostri esempi di codice su come questo potrebbe/dovrebbe essere "assemblato". Il processo di riflessione dietro il codice sarebbe utile per farmi collegare tutti i punti per me stesso. Grazie!
Perché non desidero che la "ricerca", la gestione delle transazioni e la chiamata mantengano i cambiamenti all'interno del servizio? Sembra che garantirebbe un uso corretto ogni volta. Ricerca – SonOfPirate
- forse. La gestione delle transazioni non appartiene al servizio di dominio, di solito è implementata a livello di applicazione (chiamante del servizio di dominio). "Call to persist changes" è gestito da ORM o UnitOfWork poiché stiamo modificando gli oggetti esistenti, nessuna chiamata esplicita è necessaria nel caso di NHibernate. L'idea è di mantenere il codice del dominio come ostinente alla persistenza possibile. – Dmitry
Sì, utilizzerei un OrderRepository e UoW per mantenere il dominio come indipendente dalla persistenza possibile, ma nulla impedisce al codice dell'applicazione di chiamare il servizio di cancellazione senza mantenere le modifiche all'entità Ordine. Essendo agnostico, non pensavo che fosse importante fino ad ora che non usassimo NHibernate, quindi qualsiasi ipotesi basata su quell'ORM non è valida. – SonOfPirate