Prima di tutto, non sto parlando di validazione nel senso del nullability o della lunghezza di un campo come in questo e questo domande dove possiamo utilizzare i metodi isValid () nelle business class o un validatore esterno. Tuttavia, la mia domanda è correlata alla convalida o meno nelle lezioni di business. Utilizzo uno stile di architettura a livelli con servizi che utilizzano il livello dell'origine dati e interagiscono con il modello di dominio.
Facendo semplicemente i requisiti del dominio, supponiamo di avere film e recensioni e gli utenti possono fare solo una recensione per film. Quindi, una seconda recensione è un oggetto valido ma le regole aziendali non dovrebbero consentire il completamento della revisione.
Quindi, potrei fare:
ReviewService >> addReview(review,movie)
loggedUser = getLoggedUser()
review = reviewRepository.searchReviewFrom(loggedUser,movie)
if (review == null)
reviewRepository.save(review)
else
// some mechanism to inform the error, it could be NotificationPattern
Oppure:
Movie >> addReview(review)
for r in this.reviews
if r.user = review.user
throw ReviewAlreadyUploaded
// if no expcetion is thrown
this.reviews.add(review)
Penso che la convalida oneReviewPerUser sia una regola puramente aziendale, e dovrebbe andare nelle classi business, in questo caso nella classe Movie. Quindi le regole aziendali sono contenute nel dominio e non sparse tra i livelli. Tuttavia, se gli elenchi di recensioni dei film sono grandi in quasi tutti i casi, questa opzione implica la query e crea un'istanza di un numero elevato di oggetti Review e itera su tutti gli elementi.
Supponiamo che io scelga l'opzione 1, devo assicurare che ogni cliente che vuole creare una recensione per un filmato deve utilizzare il servizio, perché potrebbe violare il vincolo aziendale di 1 recensione per utente se, ad esempio, si usa direttamente il ReviewRepository. Questo inizia a sembrare un livello di servizi con tutta la logica aziendale e un AnemicModel con classi di dominio che sono insiemi di attributi per trasportare dati da e verso il database.
Dove si trova la linea che separa la logica aziendale che dovrebbe essere su Servizi da quella che dovrebbe essere su Classi di dominio.