La creazione di oggetti è una preoccupazione tecnica che non ha nulla a che fare con l'applicazione degli invarianti di business. Direi che la validazione aziendale zero deve assolutamente avvenire nei costruttori. La validazione è meglio lasciarla durante i processi entro i quali devono essere applicati gli invarianti (dove vengono usati i dati). Seguire questa regola aiuta a mantenere il sistema molto più dichiarativo e, quindi, più facile da capire. Ricorda che DDD riguarda le regole di modellazione relative al comportamento , non alle regole di modellazione dei dati.
Ciò significa che, dato che un Customer
deve avere più di 25 anni per register
, l'applicazione di tale invariante si verifica nel metodo register
, non nel costruttore Customer
. Ciò consente la possibilità di un'altra regola che richiede un Customer
di avere meno di 25 anni per qualche altro processo.
L'unica eccezione a quanto sopra è quando i valori passati all'oggetto sono, loro stessi, ciò che l'oggetto intende astrarre (è l'identità), ad es. %codice%. In questo caso, la stringa passata in un costruttore di EmailAddress
deve essere conforme a una determinata specifica per poter essere considerata un indirizzo valido. Ciò significa che l'eccezione di cui sopra si applica solo a EmailAddress
.
Ecco un link a una risposta che ho postato a una domanda simile che potrebbe interessarti: Costruttori argomento zero e entità sempre valide
Tutto ciò che è stato detto, non vuoi andare sulla strada della compilazione di tutti gli errori di validazione prima di uscire. Non solo rende i tuoi metodi molto più complicati, funziona solo per i processi più semplici in cui tutte le convalide possono verificarsi prima che venga eseguita qualsiasi logica reale. Sembra una buona idea quando gli unici invarianti sono l'esistenza di ValueObjects
e address
di stringhe, ma cade a pezzi per operazioni più complicate. Inoltre, molti errori di dominio non sono pensati per essere visualizzati direttamente dai client (quindi cosa hai intenzione di fare con loro? Parse a dayOfWeek
in DomainErrorList
? Overkill!).
Lascia una semplice convalida dal tuo dominio e alzala "verso l'alto" nella tua vista. Questo è esattamente il motivo per cui ClientErrorList
esiste in primo luogo. Ciò che intendo è, se lo scopo di raccogliere i messaggi di errore per alcuni input è di esporli poi al tuo cliente, quindi mantenere tutta la convalida nella vista stessa (e farlo nel modo in cui MS lo fa nella loro ViewModels
- & gt ; proceduralmente). Potrei sentirmi ridondante, ma è anche disaccoppiato.