Domanda

mi sento un po 'in conflitto in questo momento. Ho un'applicazione web utilizzando Stripes per un framework MVC e Spring / Hibernate per il back-end. Ho un metodo di registrazione dell'account nel mio strato di MVC che richiede la previa convalida:

  • nome utente non è già preso
  • L'indirizzo email fornito non è già associato a un altro account

Ho un metodo di validazione in Stripes (strato MVC) che controlla questi due casi, ma chiedevo se il mio livello di servizio dovrebbe duplicare questi controlli? Se l'interfaccia livello di servizio è stato esposto come un servizio web allora penso che la convalida sarebbe una buona idea, ma se è utilizzata solo nel contesto di un'applicazione web è E 'necessario?

Modifica:. Non ho intenzione di duplicare il codice di convalida - voglio dire duplicare le chiamate di metodo di validazione in due punti

vedo le mie opzioni come:

  1. Duplica le chiamate di validazione sia MVC e livello di servizio
  2. eseguire soltanto questa convalida nello strato MVC
  3. eseguire soltanto questa convalida del livello di servizio.

Da qui le migliori pratiche? Sto cercando consigli / opinioni su quale opzione dovrei andare con e perché.

Si noti che ci sono semplici controlli di validazione sui campi di input del modulo di registrazione (come il controllo di spazi) e che penso che questi dovrebbero essere gestite da solo la convalida MVC; Sono solo preoccupato convalide più complesse.

È stato utile?

Soluzione

Annie,

Buona domanda, ho chiesto io stesso lo stesso in molte occasioni. Ecco quello che ho finito con (fino ad ora).

Il pura (ma noioso) approccio è invocare la logica di convalida in entrambi gli strati. l'approccio pragmatico potrebbe essere quello di invocare solo in web-terra (ad esempio i controller).

Credo che non c'è una risposta che finisce ogni discussione. Penso che dipende dal contesto del progetto. Se il progetto-size è modesto (in termini di persone e le dimensioni della base di codice) e si è certi che non un sacco di codice sarà sviluppato da altri che invocano il tuo API del servizio (in una misura che non sarà in grado di sorvegliare ), poi fare la convalida nel web-layer solo può ben sufficiente.

Tuttavia, se ci si aspetta molti client potrebbe essere necessario un titolo di livello superiore. Quando dico di sicurezza qui, mi riferisco ad esso come il livello di coerenza-garanzie di cui avete bisogno. Se tale livello è alto, non c'è modo intorno ad esso: si dovrà farlo sia nel servizio di (per la sicurezza) e lo strato web (per lo più per essere in grado di fornire agli utenti finali un'esperienza accettabile)

Quindi il driver chiave qui è la sicurezza e quanto di esso si ha realmente bisogno. Se avete bisogno di un sacco, si va per l'approccio 'puristi'. Se l'applicazione non è esattamente prendere decisioni che riguardano questioni di vita o di morte, si va per l'approccio pragmatico.

Altri suggerimenti

Codice Non duplicare. Usa JSR303 Bean Validation in modo da poter utilizzare la stessa logica di convalida in tutti gli strati la vostra applicazione.

Hibernate Validator (un progetto separato dalla roba Hibernate ORM) fornisce il riferimento implementazione di questa interfaccia. E 'morto semplice uso, puoi Inizia a molto rapidamente .

A mio parere si dovrebbe diferenciate due tipi di convalide:

  • La validazione dei dati Formato: Quale dovrebbe essere convalidato nel livello di presentazione (MVC nel tuo caso). Normalmente sia nel client e lato server
  • La validazione dei dati Bussines: Quale dovrebbe essere convalidato nel livello di servizio

Nel tuo caso le vostre convalide sono legati alle regole di business, in modo che io metterò solo nel livello di servizio. Inoltre, se si duplica le vostre convalide in entrambi gli strati si sarà fare le stesse query due volte, rallentando le prestazioni della vostra applicazione.

  1. Idealmente, fare la convalida di entrambi gli strati, dal momento che il livello di servizio può essere utilizzato con un client diverso da quello strato di MVC corrente

  2. riutilizzare il meccanismo di validazione in entrambi i posti (convalida Bean, per esempio)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top