2010-09-27 10 views
11

A medida que estoy aprendiendo más y más sobre ASP.NET MVC, más me introduzco a las anotaciones de datos.
Específicamente en MVC se usan para la validación y esto me preocupa.
Lo más grande se debe al hecho de que me gusta mantener mi modelo como POCO y lo más limpio posible.
¿Qué sucede si tengo esas clases de modelo compartidas en varios proyectos en una solución (es decir, interfaz web, aplicación de escritorio, servicios web)?
Básicamente me preocupa que las anotaciones específicas para mi aplicación MVC puedan influir en otros proyectos como Dynamic Data, etc. Ya tengo mis Business Objects separados de mi modelo de base de datos (en este caso LINQ2SQL), así que no me preocupo sobre anotaciones que tienen influencia en mi DAL, pero me pregunto si mi miedo sobre otros proyectos es legítimo.¿Las anotaciones de datos realmente son una buena idea para la validación?

También creo que atar un mensaje de error requerido a su modelo es un poco loco.

Supongo que el problema se resolvería si creara modelos separados para cada proyecto (web, escritorio, servicio web, etc.) pero esto sería prácticamente una copia directa de mi modelo actualmente compartido. ¿Es el camino correcto?
Tendría un gran impacto en mi solución (mucho mapeo de un modelo a otro sucediendo).

¿Qué opinas?
Me gustaría escuchar lo que considera un uso bueno y malo de las anotaciones de datos.

Respuesta

2

Realmente, muy buena pregunta. Especialmente dado que todas las aplicaciones de ejemplos de demos brillantes se basan en DataAnnotations que maneja toda la validación porque es un punto de venta atractivo y brillante. ¿Y a quién le gusta hacer la validación de todos modos?

Creo que la mejor manera de ver esto es que deben ser parte de una solución de validación más completa, tanto por las razones estructurales que menciona como por sus limitaciones: cómo valida cosas como "¿Es este nombre de usuario? ¿único?" o "¿Se le permite a este gerente asignarle esta tarea a este empleado?" usando anotaciones de datos?

+0

Sé que esto es una respuesta de 5 años, pero puede usted por favor me punto en la dirección correcta? Lo que dices tiene mucho sentido, no puedes hacer todo con anotaciones de datos. – dpp

+1

@dpp - sí, ha pasado un tiempo desde que construí una gran validación, y en esos años las anotaciones de datos mejoraron un poco y otras herramientas también mejoraron un poco. De todos modos, la forma en que lo abordamos fue construir una tubería de validación de dos fases. Primero fue un método basado en DataAnnotations para verificar las cosas que podría hacer en memoria en un solo objeto. La segunda fase fue una solución de dependencia inyectada que podría conectar la validación con la base de datos para buscar cosas como la singularidad y otros requisitos que requerían consultas. Hoy probablemente solo usaría FluentValidation como pegamento aquí. –

3

DataAnnotaciones no es el único método disponible para la validación y puede utilizar más de un método de validación. La mayoría de las validaciones que he visto al utilizar DataAnnotations son específicamente para validar los datos que irán a la base de datos. Tales como MaxLength() y Range().

IValidatableObject es el más flexible que he visto cuando se trata de escribir sus propias validaciones. Sin embargo, no ayuda a su ejemplo específico de tener un único repositorio que pueda contener todos sus objetos. ¡Pero no miedo!

IDataErrorInfo es otra forma de validación de datos y esta se puede utilizar solo en su aplicación MVC y no afectaría a otros proyectos.

Si una clase implementa la interfaz IDataErrorInfo, la estructura de ASP.NET MVC utilizará esta interfaz al crear una instancia de la clase. Por lo tanto, puede separar su validación utilizando una interfaz de localización de servicios o algo similar.

Sin embargo, creo que IValidatableObject es una mejor implementación.

0

No estoy seguro de si las Anotaciones de datos arruinarán sus otros proyectos, pero se espera que ignoren las Anotaciones de datos a menos que cree algunas clases para verificarlas.

Para mantener su POCO lo más simple posible, la intención de DataAnnotaciones es mantener metadatos y datos en el mismo lugar (es decir, si se requiere que _UnitsInStock sea siempre un entero positivo, de alguna manera este requisito está relacionado con la definición de datos de "unidades en stock" y se ajusta perfectamente a la definición de modelo). También ayuda a evitar algunos errores, ya que no importa dónde esté usando la validación (dentro de un proyecto de mvc), las reglas siempre serán las mismas (por lo que no puede olvidarse de verificar una variable por un valor mínimo en la página A mientras comprueba en la página B). Los mensajes de error no son necesarios, pero puede usarlos para mostrar un mensaje más amigable, y este mensaje de error se mostrará en todas partes.

También hace que sea muy fácil implementar la validación automatizada de servidor y cliente (mvc).

Por otro lado, a pesar de que tiene la capacidad de crear atributos personalizados para verificar las reglas comerciales, requiere más conocimiento y paciencia que usar una "clase ejecutiva" (si no está acostumbrado) y hasta Lo sé, solo es oficialmente compatible con mvc 2.

Si sus clases de modelo se comparten entre otros proyectos, probablemente también tenga una capa de validación compartida, por lo tanto, utilice esta capa de validación. Si no lo tiene, DataAnnotaciones hará su vida más fácil en los proyectos de MVC.

2

Personalmente encuentro DataAnnotations muy agradable para la validación de MVC ViewModels y entrada publicada. Nunca jamás los pondría en mis modelos de negocios.

También me he vuelto bastante parcial para atribuir los atributos de validación porque es realmente fácil entrar en Reflection para descubrir qué atributos están donde.

6

Encuentro las anotaciones de datos convenientes para los modelos donde las reglas nunca cambian según el contexto, como una dirección de correo electrónico.

Pero para una validación más compleja (campos múltiples, requiere acceso a bases de datos, etc.) utilizo el patrón de visitante descrito en Entity validation with visitors and extension methods.

+0

Estoy planeando usar la segunda opción que sugirió, utilizando el patrón de visitante. Tengo una pregunta, ¿cómo implementamos esto cuando el modelo está siendo utilizado por diferentes contextos? Uno necesita validar el Cliente de cadena como el campo requerido, pero en otro contexto, el Cliente no es necesario. Cómo ir sobre este escenario. Aprecio tu ayuda. –

+0

Vea este artículo para ver un ejemplo del patrón de visitante https://lostechies.com/jimmybogard/2007/10/24/entity-validation-with-visitors-and-extension-methods/ Luego mezcle algo como https://www.nuget.org/packages/FluentValidation/ –

0

No creo que deba preocuparse por compartir un dominio decorado en múltiples tecnologías. DataAnnotations es parte del BCL y puedes usarlo en WCF, WPF, MVC, formularios web, lo que sea (incluso en Silverlight).

Dado que DataAnnotations es ahora una parte central del BCL, podemos esperar que otros marcos de validación puedan leer esos atributos en el futuro, como ya lo hace Enterprise Application Validation Application Block 5.0. Esto permite extender el modelo con validaciones más complejas más adelante, sin tener que cambiar las reglas de validación del núcleo.

Sin embargo, puedo entender que desee mantener su modelo y las reglas de validación separadas. Si esto es lo que desea, el Bloque de aplicación de validación (VAB) puede ser una buena alternativa (o incluso una adición, debido a su integración con DataAnnotations). VAB admite la validación basada en configuración, que le permite separar por completo las reglas de validación del modelo.

Cuando sus reglas de validación son muy simples, sin embargo, VAB puede ser una exageración. Es extremadamente potente y extensible, pero también es complejo y requiere mucho tiempo de aprendizaje.

+0

¿Podría proporcionar un enlace a una o más referencias de VAB? – Steve

+0

Puede comenzar leyendo las 'Instrucciones de validación CS.pdf' que forman parte de la descarga de laboratorios prácticos EntLib: http://bit.ly/gJpVjl (carpeta CS \ Validación \ instrucciones). Ofrece una buena visión general de las características de VAB. – Steven

Cuestiones relacionadas