we can't have duplicate Category names either, that would just cause confusing and redundancy.
Supponendo che tu abbia un invariante di business che non richiede nomi di categorie duplicati, allora la responsabilità di far rispettare quell'invariant appartiene a qualche aggregato. Poiché l'applicazione della regola richiede l'accesso a tutti i nomi di categoria attualmente in uso, lo stesso aggregato deve includere, come parte del suo stato, quella raccolta di nomi.
Questa è una costruzione aggregata di base: il controllo della coerenza e lo stato vanno insieme.
where should this validation take place?
Nel comando reserveName () dell'aggregato.
Should there be a "service" layer that takes a UI model and turns it into the domain model and attempts to validate it?
No, qui non dovrebbe esserci nulla di insolito. Il cliente desidera utilizzare un nuovo nome, quindi invia una rappresentazione del comando ReserveName
all'applicazione. L'applicazione reidrata il comando, individua il gestore di comandi appropriato e invia il comando al gestore. Il gestore carica l'aggregato e invoca il metodo reserveName () utilizzando gli argomenti forniti. Questo segue esattamente lo stesso schema di ogni altro comando che invii al modello di dominio.
Se l'aggregato scopre che il nome della categoria è già in uso, genera un'eccezione di dominio e la tua applicazione lo segnala al client; di nuovo, esattamente come ogni altro comando indirizzato al modello di dominio.
Quale aggregato è "l'aggregato"? Mi fa battere: devi cercare nella lingua onnipresente per scoprire l'aggregato che rafforza questo invariante. Ad esempio, potrebbe esserci un aggregato che ha questa responsabilità e nient'altro. In un esempio di giocattolo come questo, potresti fingere che CategoryNameReservationBook sia qualcosa che ha senso per il business. O forse NameReservationBook, con un'istanza NRB utilizzata per i nomi delle categorie, e un'altra istanza NRB utilizzata per i titoli dei post dei blog, o qualcosa di simile.
Quando ne parli con i tuoi esperti di dominio, potresti scoprire che "nessuna categoria duplicata" non è davvero un limite difficile. Nelle ddd , è importante sentire la differenza tra "che non deve mai accadere "e" che non dovrebbe accadere "; quest'ultima frase implica che accade occasionalmente, e se è così probabile che ci sia già un processo per quella contingenza.
Potresti anche trovare, nella discussione, che questo non è affatto un vincolo di business; in quale cast lo si estrae completamente dal modello di dominio - se è qualcosa di reale, forse l'handle dell'applicazione è solo, o forse c'è qualche altro modello di dominio (forse in un altro contesto limitato) che ne è responsabile.
Cercare di supportare questo vincolo con servizi e simili in realtà non funziona; il servizio in esecuzione in questa transazione non può vedere cosa viene modificato in altre transazioni, quindi ottieni una corsa di dati. Hai lo stesso problema nel tentativo di utilizzare una specifica: i dati utilizzati per inizializzare la specifica sono obsoleti e un'altra transazione può essere eseguita qui.
I modelli di dominio con condizioni di competizione sono comunque sospettosi; se due utenti che lavorano su attività separate si bloccano a vicenda, allora qualcosa non va. Udi Dahan è andato così lontano da scrivere che le condizioni di gara non esistono - che nel mondo degli affari, il conflitto non è impedito, così come viene rilevato e mitigato.
Quindi controlla, e ricontrolla, e controlla tre volte che forse il vincolo di unicità non è tutto questo, per quanto riguarda gli esperti di dominio. Ma se è davvero una regola aziendale che non ci sono duplicati, segue, incondizionatamente, che esiste un responsabile aggregato per tenerne traccia.
A ulteriore considerazione, un problema di unicità come questo potrebbe essere ambito ; il blog del programmatore ha una categoria denominata rest , e il blog di salute ha una categoria rest , ma non sono la stessa cosa. Questo potrebbe essere supportato dando a ciascun blog il proprio libro di prenotazione, ma potrebbe anche essere un suggerimento che la Categoria sia semplicemente un'entità, subordinata a qualche altro aggregato.