Spesso mi imbatto in questo scenario decisionale su dove chiamare un dominio (o un servizio applicativo) quando si costruiscono i miei modelli di dominio. Forse la confusione sta nell'identificare se si tratta di un servizio di dominio o di un servizio di applicazione stesso. Mi piacerebbe vedere cosa pensano gli altri. Farò del mio meglio per spiegarlo con uno scenario semplice e porrò altri esempi in cui mi imbatto.
Immagina un modello di dominio degli indirizzi. Ha i seguenti elementi:
- AddressLine1
- AddressLine2
- Città
- StateProvince
- Paese
- ZipCode
Ora ho definito un costruttore in questo modo:
Address(string addressLine1, string addressLine2, string city, string stateProvinceCode, string countryCode, string zipCode)
Devo garantire che il codice della provincia di stato che viene passato corrisponda a una provincia statale del Paese. Se avessi un database di città, mi piacerebbe anche abbinare la città e il codice postale.
In scenari come questi, come posso risolvere al meglio questo? Ecco le mie opzioni:
- Mantengo il costruttore molto semplice, non ci dovrebbero essere motivi per cui qualcuno non possa archiviare tutti i dati che vogliono costruire l'oggetto indirizzo. Creo quindi un metodo chiamato Validate () nel modello di dominio che accetta un IAddressValidator che sa come convalidare i dati.
L'implementazione di IAddressValidator può essere specifica dell'implementazione.
-
In alternativa, introduco IAddressValidator come parte del costruttore. Il problema con questo approccio è che ora tutti coloro che desiderano utilizzare il dominio Indirizzo (indipendentemente dalle ragioni rudimentali) devono ora preoccuparsi di creare l'implementazione di IAddressValidator.
-
Non hai affatto IAddressValidator / Validate nel dominio. Supponiamo che il dominio venga popolato da un servizio applicativo, ad esempio AddressService che esegue il lavoro di convalida di tutti i dati e quindi inserisce il modello di indirizzo che può essere successivamente memorizzato nel database. Ciò significa anche che se qualcuno non chiama il servizio di indirizzi per effettuare le convalide, rischia di salvare dati non validi nell'indirizzo.
Allo stesso modo, ho molti scenari simili in cui mi sembra di non sapere dove sia il posto migliore per convalidare i dati in arrivo.
Esempi:
-
Un esempio in cui un utente risponde alle domande del sondaggio. Ogni domanda ha potenziali opzioni di risposta che devono essere convalidate prima che la risposta venga aggiunta a un sondaggio. Questa convalida appartiene al livello di dominio, ad esempio dovrei fare SaveAnswer (risposta risposta, validatore IAnswerValidator) ? Oppure a livello di servizio usando IAnswerValidator per prima convalidare la risposta e poi semplicemente chiama SaveAnswer (Answer answer) nel dominio assumendo che tutta la convalida verrà eseguita dal livello di servizio?
-
Scenario di commercio elettronico, quando un articolo viene aggiunto al carrello e dobbiamo anche convalidare se l'inventario esiste. Dovremmo passare l'interfaccia di controllo inventario al dominio in questo modo: AddItem (elemento CartItem, checker IInventoryChecker) ? O dovremmo farlo a livello di servizio e lasciare il dominio con un semplice metodo AddItem (elemento CartItem) .