Estoy tratando de implementar una estrategia de validación en mi aplicación. Tengo una capa MVC, capa de servicio, repositorio y POCOs de dominio. Ahora, en la capa MVC, utilizo anotaciones de datos en mis modelos de vista para validar la entrada del usuario, lo que me permite darle al usuario comentarios rápidos. En el controlador, llamo a ModelState.IsValid para verificar la entrada antes de usar el automapper para configurar un objeto de dominio.Validación de la capa de servicio
Aquí es donde está mi problema. Paso mi objeto de dominio al Servicio que necesita validarlo contra mis reglas de negocio, pero ¿cómo devuelvo los errores de validación al controlador? Los ejemplos que he encontrado hacen una de las siguientes:
- Lanza una excepción en la capa de Servicio y atrapa en el Contoller. Pero esto parece incorrecto, sin duda las excepciones son para casos excepcionales, y deberíamos devolver algo significativo.
- Use un ModelStateWrapper e inyecte ModelStateDictionary en el servicio. Pero este método finalmente se desarrolla en una dependencia circular (el controlador depende del servicio, el servicio depende del controlador) y esto parece ser un mal olor de código.
- Agregue un método Validar al POCO. El problema con esto es que una regla comercial puede depender de otros objetos POCO, por lo que seguramente esto debe hacerse en el Servicio que tiene acceso a las tablas y objetos necesarios.
¿Existe un método más simple que me falta? He visto muchas preguntas con respecto a esto, pero ninguna solución concreta aparte de las mencionadas anteriormente. Estoy pensando que cualquier método en el Servicio que haga la validación podría simplemente devolver algún objeto clave/valor que pueda usar en el controlador, pero no estoy seguro de si esta estrategia podría ser problemática más adelante.
Puede encontrar la siguiente respuesta útil: http://stackoverflow.com/a/4851953/29407 –
Gracias Darin, esto parece prometedor, aunque va por el enfoque de excepción. ¿Es esta la forma comúnmente aceptada de hacer esto? – James