2011-04-15 8 views
5

Comenzando con todo esto de MVVM, estaba siguiendo este post by Josh Smith que habla de un enfoque de validación al usar MVVM. El ejemplo es simple, y comencé a preguntarme cómo usarlo en mi propia aplicación.¿Dónde debo realizar una comprobación para ver si ya existe un valor en la base de datos al realizar la validación en MVVM utilizando IDataErrorInfo?

Tengo, en mi BLL, una clase BookInfo que implementa IDataErrorInfo para informar valores no válidos como "la fecha publicada no puede estar en el futuro" o "el número de páginas no puede ser negativo". Entonces mi AddBookViewModel verificaría el estado del recién creado BookInfo, verificará que existan errores, y el AddBookView mostrará un blob rojo al lado del TextBox apropiado. Eso es sencillo, como en el ejemplo de la publicación.

Ahora mi clase BookInfo también tiene una lista de ID de autor. Al agregar un nuevo BookInfo a mi base de datos, necesito verificar si esos ID de autor ya existen.

¿Debería hacerse esta verificación en mi clase BookInfo? Si es así, entonces tendría que pasar el objeto AuthorManager de mi BLL al constructor BookInfo, ya que el primero contendría métodos como CheckIfExists(int authorID).

¿Es este el enfoque recomendado? ¿Qué pasa si hay muchos registros en el DB? ¿La verificación dinámica afectaría el rendimiento?

Por otro lado, parecería un poco complicado realizar algunos controles en la clase BookInfo y en otros lugares ... especialmente cuando todos esos controles se pueden categorizar en el mismo grupo ... es decir. asegurándose de que un objeto BookInfo recién creado sea válido. O tal vez estoy equivocado ya que realmente no tengo experiencia para hacer un juicio adecuado.

¿Alguna orientación?

Respuesta

7

No haría esto. Mantendría las validaciones hechas 'dentro' IDataErrorInfo simples y sin contexto. Cualquier validación que dependa del contexto, como las validaciones y validaciones de entidades cruzadas que dependen de una base de datos, hacen esa validación cuando guarda los cambios.

Probar estas validaciones basadas en el contexto más complejas en IDataErrorInfo será propenso a errores y, a menudo imposible. A menudo es imposible hacer esto de manera confiable sin un contexto.

He escrito una publicación en el blog sobre esto. Si bien está escrito en el contexto (sin juego de palabras) del Bloque de la aplicación de validación, habla sobre el problema general de la validación basada en el contexto. Puede ser útil. Here it is.

+0

Bien, gracias chicos. – ForeverLearnNeverMaster

5

Estoy de acuerdo con Steven en que debe realizar las validaciones del lado del servidor al intentar guardar los datos.

Otra razón para esto es la latencia de la red. Dado que el soporte de WPF para IDataErrorInfo usa eventos de entrada para determinar cuándo se validan las propiedades, y da como resultado una llamada de bloqueo/sincrónica a su objeto VM, el uso de IDataErrorInfo tiene un impacto directo en la capacidad de respuesta de la IU. No puede comenzar una llamada asincrónica a su base de datos para realizar la validación y luego enviar errores de validación al subproceso de interfaz de usuario cuando finaliza su llamada de red. Tendría que realizar una llamada de bloqueo a su base de datos para obtener el resultado, lo que podría causar estragos en el hilo de la interfaz de usuario mientras espera la devolución de la llamada.

Espero que algún día WPF obtenga la sofisticada nueva interfaz INotifyDataErrorInfo de Silverlight, que permite el escenario de validación asíncrona que describí anteriormente.

Cuestiones relacionadas