Sto tentando di implementare una strategia di convalida nella mia applicazione. Ho un livello MVC, livello di servizio, repository e dominio POCO. Ora, nel livello MVC, utilizzo le annotazioni dei dati sui miei modelli di visualizzazione per convalidare l'input dell'utente, permettendomi di fornire un feedback rapido all'utente. Nel controller, chiamo ModelState.IsValid per verificare l'input prima di usare automapper per impostare un oggetto dominio.Convalida livello servizio
Ecco dove il mio problema è. Trasmetto il mio oggetto dominio al servizio che deve convalidarlo rispetto alle mie regole aziendali, ma come faccio a inoltrare gli errori di convalida al controller? Gli esempi che ho trovato eseguono una delle seguenti operazioni:
- Genera un'eccezione nel livello Servizio e cattura il Contoller. Ma questo sembra sbagliato, sicuramente le eccezioni sono per casi eccezionali, e dovremmo restituire qualcosa di significativo.
- Utilizzare ModelStateWrapper e iniettare ModelStateDictionary nel servizio. Ma questo metodo alla fine si sviluppa in una dipendenza circolare (il controllore dipende dal servizio, il servizio dipende dal controller) e questo sembra essere un cattivo odore di codice.
- Aggiungere un metodo di convalida a POCO. Il problema è che una regola aziendale può fare affidamento su altri oggetti POCO, quindi sicuramente questo dovrebbe essere fatto nel Servizio che ha accesso alle tabelle e agli oggetti richiesti.
C'è un metodo più semplice che mi manca? Ho visto molte domande su questo, ma nessuna soluzione concreta oltre a quelle sopra menzionate. Sto pensando che qualsiasi metodo nel Servizio che esegue la convalida potrebbe solo restituire un oggetto chiave/valore che posso usare nel controller, ma non sono sicuro se questa strategia potrebbe essere problematica in seguito.
È possibile trovare la seguente risposta utile: http://stackoverflow.com/a/4851953/29407 –
Grazie a Darin, questo sembra promettente, anche se si tratta dell'approccio Eccezione. È questo il modo comunemente accettato per fare questo? – James