2009-05-16 20 views
7

¿Alguien tiene enlaces o consejos sobre cómo conectar la validación que requiere interactuar con la base de datos antes de actualizar o agregar a la base de datos? Todos los ejemplos que veo muestran cómo validar propiedades, p. "Se requiere", "Es correo electrónico", "Es numérico", etc., pero ¿cómo se conecta la validación de "No se puede ordenar el artículo en existencia"? This xVal blog post toca pero no proporciona un ejemplo.asp.net validación de interacción con la base de datos mvc

He estado siguiendo el tutorial NerdDinner que usa un repositorio, pero este es el bit que aún no me sale ... Digamos que teníamos un OrderController con un método Create, y antes de crear un pedido teníamos que primero verifique que el artículo esté en stock. En el estilo NerdDinner, el controlador usa el Repositorio para hablar con la base de datos, entonces, ¿cómo podría nuestro Objeto de pedido (Modelo) hacer valer esta validación junto con la validación de la propiedad, ya que no puede comunicarse con la base de datos?

Gracias por cualquier ayuda

Respuesta

0

me gustaría crear un OrderService con un método PlaceOrder (orden de pedido). OrderService utiliza el Repositorio para realizar operaciones CRUD y para hacer cumplir las reglas comerciales (verificación de existencias) y, finalmente, lanza una excepción sobre la violación de las reglas que puede detectar e informar al usuario.

+0

Tenía la esperanza de mantener esto en el contexto de NerdDinner y no utilizar los servicios en este momento. Me gustaría mantener las cosas lo más simples posible para entender cómo está todo conectado. gracias – atwrok8

3

En el tutorial de NerdDinner, puede consultar los métodos IsVaild y GetRuleViolation. En función de las reglas de su empresa y de la base de datos, puede usarlas para verificar los datos que tiene antes de insertarlos. Incluso podría crear un método IsValidForInsert para verificar cualquier regla específica de inserción que necesite aplicar.

En NerdDinner, GetRuleViolation le permite recuperar las reglas violadas y enviarlas a la interfaz como desee.

public bool IsValid 
    { 
     get { return (GetRuleViolations().Count() == 0); } 
    } 

    public IEnumerable<RuleViolation> GetRuleViolations() 
    { 


     if (CheckDbForViolation) 
      yield return new RuleViolation("Database Violation", "SomeField"); 

     if (String.IsNullOrEmpty(Title)) 
      yield return new RuleViolation("Title is required", "Title"); 

     if (String.IsNullOrEmpty(Description)) 
      yield return new RuleViolation("Description is required", "Description"); 

     if (String.IsNullOrEmpty(HostedBy)) 
      yield return new RuleViolation("HostedBy is required", "HostedBy"); 

... etc ... 


     yield break; 
    } 

    public bool CheckDbForViolation() 

    { 

    /// Do your database work here... 

    } 

Puede seguir adelante y dividir el código de la base de datos en el repositorio. CheckDbForViolation llamaría al repositorio para obtener la información y luego determinaría si hubo una infracción o no. De hecho, si está utilizando un repositorio, creo que sería la forma preferible de hacerlo.

+0

He leído sobre IsValid y GetRuleViolations, pero no se menciona el escenario "No se puede pedir fuera de stock". ¿Dónde se colocaría este tipo de regla comercial? gracias – atwrok8

+0

Uno de los pasos de validación sería salir y consultar la base de datos para ver si el artículo está en stock. Luego continúe si es bueno o falla y evite que ocurra la escritura de la base de datos. –

+0

Entiendo cuál es el paso de validación, pero ¿DÓNDE iría la lógica? El Controlador utiliza el Repositorio, por lo tanto, para consultar la base de datos, esta lógica debería estar en el Controlador. Sin embargo, entiendo que las reglas comerciales deben permanecer en el Modelo. Estoy empezando a pensar que el Controlador no debería estar usando el Repositorio? gracias – atwrok8

1

Realmente no necesita ninguna guía de ejemplos sobre cómo hacer esto. En última instancia, tendrá que ser capaz de crear dichas aplicaciones por su cuenta, lo que significa ser creativo.

He decidido desde el principio no utilizar la validación incorporada o API de membresía para no tener que cumplir con sus limitaciones en algún momento.

Para su situación: es más o menos estándar.

imaginar el flujo de ejecución de la siguiente manera:

  1. formulario de envío
  2. formato de datos de entrada Validar sin hablar con la base de datos
  3. Si (2) es pase, a continuación, se valida la entrada desde el punto de reglas comerciales/integridad de datos. Aquí habla con la base de datos
  4. Si pasó (3) y luego realiza su operación sea lo que sea. Si de alguna manera falla (tal vez las reglas de integridad de datos en la base de datos prohíban la operación, por ejemplo, eliminó un objeto relacionado de la otra ventana del navegador), luego cancélelo y notifique al usuario de un error de operación.

Trate de mantener los métodos del controlador lo más vacíos posible. La lógica de validación y operación debe residir en sus modelos y lógica comercial.El controlador básicamente debe intentar la operación prevista y, en función del estado devuelto, solo devuelve una vista u otra. Tal vez algunas opciones más, pero no toda la carga de verificaciones de roles de usuario, derechos de acceso, llamadas a algunos servicios web, etc. Mantenlo simple.

P.S. A veces tengo la impresión de que las funciones incorporadas destinadas a simplificar las cosas simples para la mayoría de los desarrolladores tienden a crear nuevas barreras sobre las eliminadas.

+0

El flujo de ejecución que ha enumerado es exactamente lo que haría, no estoy seguro en términos del ejemplo de NerdDinner, donde se colocaría la validación. Tendría más sentido para mí si el objeto Order usaba el Repository y luego el Controller hablaba únicamente al objeto Order. De esta manera, el objeto de la orden para manejar ambas formas de validación ya que ahora puede hablar con la base de datos, ¿Sería esa una mejor opción, crees? gracias – atwrok8

+0

No estoy familiarizado con el ejemplo de NerdDinner. Si "Repositorio" representa algún tipo de capa de base de datos, mientras hay una capa de lógica de negocios intermedia (su Orden, por ejemplo, puede considerarse un objeto comercial), es claramente incorrecto que un controlador use Repositorio directamente para cualquier propósito. La comunicación debe ser: [Controlador] <-> BLL <-> DAL. A veces solo usas modelos en lugar de BLL, pero no es exactamente lo correcto. Los modelos están allí solo para empaquetar los datos de una vista para mostrar. – User

Cuestiones relacionadas