I problemi che si verificano non sono causati da Domain Driven Design, ma piuttosto da una mancanza di separazione delle preoccupazioni. Domain Driven Design non si limita a mettere insieme dati e comportamenti.
La prima cosa che consiglierei è di prendere un giorno o più e leggere Domain Driven Design Quickly disponibile come download gratuito da Info-Q. Ciò fornirà una panoramica dei diversi tipi di oggetti di dominio: entità, oggetti valore, servizi, archivi e fabbriche.
La seconda cosa che consiglierei è di andare a leggere su Single Responsibility Principle.
La terza cosa che consiglierei è di iniziare a immergersi in Test Driven Development. Mentre imparare a progettare scrivendo i test per primo non ti rende necessariamente un design eccezionale, tende a guidarti verso design liberamente accoppiati ea rivelare problemi di progettazione in precedenza.
Nell'esempio che hai fornito, WebsiteUser ha decisamente troppe responsabilità. In effetti, potresti non aver bisogno del WebsiteUser
poiché gli utenti sono generalmente rappresentati da un ISecurityPrincipal
.
È un po 'difficile suggerire esattamente come dovresti avvicinarti al tuo progetto data la mancanza di contesto di business, ma prima raccomanderei di fare un po' di brainstorming creando alcune schede che rappresentano ciascuno dei principali nomi che hai nel tuo sistema (ad es. Cliente, Ordine, Ricevuta, Prodotto, ecc.). Scrivi in alto i nomi delle classi di candidati, quali sono le responsabilità che ritieni siano inerenti alla classe a sinistra e le classi a cui collaborerà a destra. Se alcuni comportamenti non sembrano appartenere ad alcuno degli oggetti, è probabilmente un buon candidato al servizio (ad esempio AuthenticationService).Distribuisci le carte sul tavolo con i tuoi college e discuti. Non fare troppo di questo però, dato che questo è in realtà solo un esercizio di progettazione di brainstorming. Può essere un po 'più facile farlo a volte che usare una lavagna perché puoi spostare le cose.
A lungo termine, dovresti davvero prendere il libro Domain Driven Design di Eric Evans. È una lettura grande, ma vale la pena. Ti suggerisco inoltre di scegliere tra Agile Software Development, Principles, Patterns, and Practices o Agile Principles, Patterns, and Practices in C# a seconda delle tue preferenze di lingua.
Grazie per questo commento. Ho letto il libro di Mr. Evans. Immagino che il problema sia quando un'entità ha molti collaboratori. per esempio. un utente del sito Web (o principale) ha un ultimo ordine, un primo ordine, un carrello della spesa, una password ecc. Tutti questi sono direttamente correlati a un utente del sito web. – Pablojim
L'autenticazione, lo stato dell'ordine in attesa (ad esempio il carrello acquisti) e la cronologia degli ordini sono preoccupazioni distinte. Prendi in considerazione l'estrazione dell'autenticazione in un IAuthenticationService e la creazione di un IOrderHistoryRepository (o forse un IOrderHistoryService) per incapsulare il comportamento del recupero della cronologia degli ordini per un determinato utente. –