Domanda

Con le nuove funzionalità di ASP.NET MVC 2 di convalida, si possono decorare le proprietà del nostro dominio oggetti del modello con attributi DataAnnotations che descrivono i criteri per i valori validi. Il DefaultModelBinder conosce questo e popola ModelState.IsValid conseguenza prima è invocata un'azione del controller. Dal momento che le regole di validazione sono definiti all'interno del modello di dominio, questo è considerato come la validazione dei modelli di livello. Scott Guthrie scrive :

  

Il vantaggio di attuazione delle regole all'interno del nostro oggetto Person è che questo farà sì che la convalida sarà eseguita tramite qualsiasi scenario all'interno della nostra applicazione che utilizza l'oggetto Person [...]

A rigor di termini, le regole non sono realmente applicate a mio parere, dal momento che tutti i metodi d'azione devono controllare la proprietà ModelState.IsValid e agire in modo diverso a seconda del suo valore. Inoltre, anche se le regole sono definito nel modello, che vengono applicate nel livello di presentazione in quanto è lì che tutti i leganti modello dal vivo. Ma credo che questo è solo me essere esigente con la scelta delle parole (o me solo essere sbagliato pianura).

Tuttavia, per quanto riguarda far rispettare le regole di convalida a livello di modello di dominio? Steven Sanderson usa questo approccio in un post sul quadro di convalida xVal dove scrive:

  

Ora, il modello di livello rafforza la propria validità, rifiutando di mettere le prenotazioni che non soddisfano tutte le regole di convalida e di business.

Nel suo esempio, il "manager prenotazione" (che vive all'interno del modello) lancia uno speciale un'eccezione regola aziendale quando si consumano codice tenta di effettuare una prenotazione che non è valido. Così è impossibile per il codice consumare per collocare una prenotazione valida, indipendentemente dal fatto che controllare la validità della prenotazione in anticipo (attraverso ModelState.IsValid o qualche altro costrutto personalizzato).

Quindi la mia domanda è:

Supponendo che non ci sono regole di convalida definite a livello di modello, dovrebbero anche essere applicate all'interno del modello?

(si noti che sono davvero nuovo al concetto di Domain-Driven Design, quindi per favore abbiate pazienza con me, se non ho usato proprio la terminologia corretta.)

È stato utile?

Soluzione

  

Supponendo che non ci sono regole di convalida definite a livello di modello, dovrebbe anche essere applicate all'interno del modello?

Sì. Se si fornisce un modo per le regole da cortocircuito, allora saranno. Forse non da te, e forse non tanto presto, ma sicuramente da altri sviluppatori in X settimane / mesi / anni nel futuro.

In più c'è sempre l'elemento errore umano - forse un giorno quando si è stanchi o codifica a tarda notte, di leggere in modo non corretto questo flag convalida e in realtà si sta lasciando record attraverso che non convalidano. (Non si fanno beffe, l'ho fatto io!)

Ora sempre assicurarsi un record non può mettersi in contatto con la banca dati senza essere convalidato dal modello.

Altri suggerimenti

Io non sono troppo sicuro di O questo DataAnnotations. Ma sembra che dovrebbero lavorare in tutto il mondo, se il modello è in ASP.NET MVC progetto o no e utilizzato da lì o no. Perché DataAnnotations sono parte di System.ComponentModel.DataAnnotations. Io trovare questo particolarmente utile in quanto ho tutti i miei modelli definiti in progetti separati, al di fuori del progetto di base MVC nella mia soluzione VS.

DataAnnotations sono una caratteristica utile di ASP.NET MVC 2, lo fa davvero fornire un modo economico bello avere sia sul lato server e la validazione lato client. Anche se, hai ragione a sottolineare un importante weaknesse. Ma anche io non credo che applicando la convalida tramite il modello è una cosa sicura sia; Vedo due aspetti:

Problema 1: come stai facendo per far rispettare questo? È possibile inserire tutti i tipi di convalida sul costruttore, e il tuo setter, ecc ..., ma si può facilmente incorrere in problemi in cui è necessario aggirare tali norme. Un buon esempio è serializzazione; mentre si può generalmente lavorare intorno ad esso, a volte durante la deserializzazione di un oggetto è sufficiente per consentire l'oggetto deve essere in uno stato non valido per un momento. Un altro esempio potrebbe essere semplicemente un modello gerarchico estremamente complesso (per esempio, un genitore richiede un bambino e quel bambino richiede un genitore, ovviamente, hai un problema di pollo e uova dal momento che non è possibile costruire simultaneamente).

Numero 2: per quanto riguarda le regole di convalida a un livello superiore (ad esempio, i nomi utente devono essere univoci)? Non si può avere queste regole nel Modello.

Alla fine della giornata si dovrebbe cercare di rendere il codice più pulito e l'intenzione rivelando il più possibile, e mantenere le cose ben collaudati. Devo ancora vedere alcuna convalida sulla base del modello che realmente protegge pienamente l'integrità dei dati al 100% del tempo. Anche se un utente non si rompe il vostro modello, un altro sviluppatore alla fine lo farà.

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