none
Validar datos en capa logica y devolver mensajes a la capa de presentación RRS feed

  • Pregunta

  • Hola:

     Quisiera me orientaran sobre la manera de validar la informacion enviada por el usuario desde la capa de presentacion de un proyecto de windowsforms hacia la capa logica, por ejemplo si un valor es requerido y se envio un nulo, si se requiere una fecha diferente a otra, etc.

     Leandro en esta conversacion tocaste este punto, pero no quice aunar un tema a otro, para que el foro continue con sus directrices y se traten temas por separados.

     

    podrias hacer

    List<string> mensajes = new List<string>();
    
    if (this.Cédula == "") mensajes.Add("Debe ingresar el Nº de cédula");
    if (this.Ruc == "") mensajes.Add("Debe ingresar el Nº de ruc");
    if (this.RazonSocial == "") mensajes.Add("Debe ingresar la razón social");
    if (this.Dirección == "") mensajes.Add("Debe ingresar la dirección");
    if (this.Ciudad == "") mensajes.Add("Debe ingresar el nombre de la ciudad");
    if (this.Teléfono == "") mensajes.Add("Debe ingresar el Nº de teléfono");
    if (this.Celular == "") mensajes.Add("Debe ingresar el Nº de movil");
      
      
    if(mensajes.Count() > 0)
    	throw new CustomException(mensajes);

    Para este caso, se envian simples parametros desde la capa presentacion y si estos pasan las validaciones se cargarian las entidades?


    Saludos desde Monterrey, Nuevo León, México!!!


    miércoles, 13 de febrero de 2013 15:16

Respuestas

  • Buenas!

    Sí, esta es una opción aunque discrepo totalmente de usar una excepción para pasar los mensajes. Las excepciones son para eso: casos excepcionales y no para controlar el flujo de acción de tu programa.

    Al margen de eso, esta solución me parece totalmente válida. Aunque personalmente antes de reinventar toda la rueda me apoyaría en alguna librería que me diese algo hecho, como puede ser FluentValidation (http://fluentvalidation.codeplex.com/).

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta JoséLuisGarcía miércoles, 13 de febrero de 2013 23:12
    miércoles, 13 de febrero de 2013 15:22
    Moderador

Todas las respuestas

  • Buenas!

    Sí, esta es una opción aunque discrepo totalmente de usar una excepción para pasar los mensajes. Las excepciones son para eso: casos excepcionales y no para controlar el flujo de acción de tu programa.

    Al margen de eso, esta solución me parece totalmente válida. Aunque personalmente antes de reinventar toda la rueda me apoyaría en alguna librería que me diese algo hecho, como puede ser FluentValidation (http://fluentvalidation.codeplex.com/).

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta JoséLuisGarcía miércoles, 13 de febrero de 2013 23:12
    miércoles, 13 de febrero de 2013 15:22
    Moderador
  • algo no entendi

    lo que planteas es como enviar las validaciones del negocio a la presentacion

    o como validar en la presentacion para armar los datos que enviarias al negocio

    lo pregunto por la ultima pregunta que realizas, el planteo parece ser aplciar validaciones en la presentacion

    si es validaciones en la presentacion podrias usar el evento Validating, o quizas en el propio evento que confirma la operacion

    en la presentacion aplciarias las validaciones vasicas de requerido o de tipo de datos, para que al armar la entidad y asignar las propiedades se pueda realizar sin errores

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 13 de febrero de 2013 15:30
  • La cosa es esta, la validacion de los datos que entran por la interface deben ser validados hay.

    y antes de ser validados seria importante tambien que el control donde se capturan los datos proteja la informacion. para evitar errores de dedo.

    pero realmente con eso no es suficiente posiblemente se escape tambien algo y podria llegar a tu logica de negocio, asi que cual es la realidad que lo debes validar en ambas capas. en el caso que manejas. que un metodo debe manejar como parametro una clase y la recibe pero la recibe null, no podra trabajar con ella. asi que generara un error NUllObject algo asi se llama. pues claro que esa excepcion la debes atrapar, y la debes manejar. que

    Atrapar la excepcion es simplemente agarrarla con el catch para que el programa no se detenga o falle en una situacion

    Manjearla la excepcion es decirle que hacer cuando esta se presente, yo siempre la logeo, y envio un mensaje al usuario que la operacion no se pudo realizar.  Creo que no has entendio bien. el try catch.

    Si esta excepcion de la que hablamos usaste el try catch en la logica del negocio un metodo x, y haces tu try catch y logeas l error y modificas el mensaje. Y usas el Throw, hay la esta lanzando Esto es muy importante. so lanzas la excepcion alguien la tiene que atrapar cuando susceda

    Imagina que me avientas una pelota, si yo no la cacho ya fallo el proceso.

    Aqui es lo mismo si tu tratas una excepcion en una capa. y la lanzas la tienes que cachar en la otra capa. si no ocupas eso no la lances simplemente manejala. y el usuario si se enterara del error. pero si el usuario debe enterarse del error, no para manejarlo si no para que se de cuenta que no funciono lo que hizo.

    Cuantas veces no hemos visto en windowsError nos e logro elominar el archivo consulte al administrador y tuuuu nooooo quien es el administrador jejejeje a soy yo haaaaaaaa. jejejejeje. bueno es un ejemplo shistoso pero pr hay va. espero averme dado a entender.

    miércoles, 13 de febrero de 2013 15:36
  • Hola Leandro:

     Quiero saber cual es la manera correcta o cuales son las buenas practicas para validar los datos que contienen los controles de mis formularios antes de enviarlos a la capa de "datos" (pasando por la negocio), por ejemplo, no mandar valores nulos o string.empty si en la bd esta informacion es necesaria, se como validarlos desde la capa de presentacion pero quisiera aprender como se hace es una arquitectura en capas.


    Saludos desde Monterrey, Nuevo León, México!!!

    miércoles, 13 de febrero de 2013 15:39
  • o sea estas parado en la capa de negocio y quieres validar ?

    yo uso Exception, es mas uso un custom exception que me permite definir una lista de mensajes por parametro que puedatomar desde la presentacion y mostrarla, es mas defino un control global de errores para no tener que poner un try...catch en cada evento del form

    de esa forma si el control global de errores podrias mostrar un mensaje estandar para toda la aplicacion cuando hay un problema que es de validacion y otro diferente cuando es un error inesperado

    el definir un retorno en todos los metodos no lo veo en principio como implementarlo y que quede correcto, porque esto repercute en todos los metodo

    usar fluentvalidation podria ser una alternativa interesante

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 13 de febrero de 2013 15:48
  • hay te van unas lineas de codigo por que se me hace que no que do claro.

    //Esta es la capa de Logica
    public int suma(int ladoA, int ladoB)
    {
        try
        {
            int total = ladoA + ladoB;
            return total
        }
        catch(Exception ex)
        {
             //Este error se dio por ladoB es = null
             Aqui registras el error.
             Trow new Exception("Mensaje", ex)
        } 
         
    }

    que dice este codigo de una capa de logica que se laso un parametro en null por que la presnetacion se le fue, atrapa la expcion en el catch

    la registra, si usas el throw recuerda throw es = lanzar  lansaste la nueva excepcion por eso usaste new Exception y le cambiaste el mensaje, que tienes que hacer para que esta exception se muestre en la presentacion????

    pues claro que si la lanzaste, Alguien la tiene que cachar, en tu casa lo que pides es que sea la presentacion. y como la cachas con el try catch. Espero ahora si quede claro.

    miércoles, 13 de febrero de 2013 15:53
  • Leandro:

     Te importaria detallarme como es que usas "la lista generica de mensajes por parametro"?


    Saludos desde Monterrey, Nuevo León, México!!!

    miércoles, 13 de febrero de 2013 16:01
  • que dice este codigo de una capa de logica que se laso un parametro en null por que la presnetacion se le fue, atrapa la expcion en el catch

    a que null haces referencia? si alli solo son valores enteros, no se puede asignar ningun null en ninguna parte

    Este error se dio por ladoB es = null

    como hiciste eso ? no creo que compile si asignas null a ese parametro

    le cambiaste el mensaje, que tienes que hacer para que esta exception se muestre en la presentacion?

    como que se tendria que haces, solo un

    catch(Exception ex){

       messagebox.show(ex.Message);

    }

    con eso recuperas el mensaje de la exception que se lanza, ese catch lo haces desde la presentacion

    es mas si se quiere se podria ahcer algo que recupere el innerException para ver toda la historia del problema

    Alguien la tiene que cachar, en tu casa lo que pides es que sea la presentacion. y como la cachas con el try catch. Espero ahora si quede claro.

    no quedo claro, es logico que se atrapa con el try..catch con que otra cosa lo harias

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 13 de febrero de 2013 16:01
  • Eduard Tomas:

     Sabras si FluenValidation funciona con WindowsForms? lo pregunto porque descargue las librerias y me descargo 3 carpetas principales FluentValidation, MVC, SilverLight.


    Saludos desde Monterrey, Nuevo León, México!!!

    miércoles, 13 de febrero de 2013 16:08
  • creo que en otra pregunta habia dado un ejemplo

    creas un custom exception, si quieres lo puedes llamar BusinessException

    public class BusinessException : Exception
    {
    
        public List<string> Messages {get; set;}
    	
        public BusinessException()
        {
        }
       
        public BusinessException(List<string> messages)
        {
           this.Messages = messages;
        }
    	
    }

    esto es solo una idea, peor cuando en la presentacion detectas un BusinessException, recuperas la propiedad Messages y muestras al usuario los mensajes de validaciones

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    miércoles, 13 de febrero de 2013 16:10
  • Leandro, es que mira su pregunta.

    Cuando dije que se pasara un int null, quise decir que era un int nullamble, podria susceder era solo presentar una situacion.

    el pregunta, como hace una excepcion en la capa de logica y recibirla en la capa de presentacion.

    Siento que a el le crea esta duda, si la valido en la capa de logica. para que la valido en la presentacion. por que usar el try catch en ambas capas??? Creo que eso es lo que no le queda claro.

    por que si voy a poner un try cacth en la presentacion para que lo use en la logica. Hay esta la gran duda a la que no recibe respuesta.

    por que no tiene bien entendido que es el catch y throw

    un try catch tiene estas partes explicadas en español

    intenta hacer este codigo

    si no se logra por algun error que vas hacer a esto se le llama manejar la excepcion decir que hacer para la excepcion.

    eso lo hace en la capa de logica muy bien logea el error y lo majena vas hacer esto.

    pero luego pregunta como lo mando a la presentacion. pues como lo manda cachando la nueva excepcion que se creo. usa el try catch para recibir la excepcion que el ya menejo. solo para enviar un mensaje. como pusiste tu en el messagebox.

    yo siento que esa es la verdadera duda que el tiene. de hecho es lo que pregunta.

    Validar datos en capa logica y devolver mensajes a la capa de presentación

    lo que pasa es que no devuelve mesanjes no es un return, es un thow, y la tiene que chachar.

    miércoles, 13 de febrero de 2013 16:12
  • Hola Niquel:

     El tema no es el Try Catch ya que estos los vengo usando desde hace mucho tiempo  comprendo su funcionamiento, el tema es a lo que apuntan Eduard Tomas y Leandro. Aunque no deja de ser valiosa tu aportación.

     Gracias a todos por su interes sigo investigando sobre el Fluent Validation.


    Saludos desde Monterrey, Nuevo León, México!!!

    miércoles, 13 de febrero de 2013 16:26
  • Cuando dije que se pasara un int null, quise decir que era un int nullamble, podria susceder era solo presentar una situacion.

    ok, pero no debrias haber usado

    public int suma(int ladoA, int? ladoB)

    para que quede claro el ejemplo


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 13 de febrero de 2013 16:30
  • a okey me disculpo entonces,

    Entonces como te dijo eduardo tomas, las excepciones son para mandar exepciones de error, se podria decir que lo estas usando como un else si no se cumple la condicion throw exepction, como que no esta bien eso.

    List<string> mensajes = new List<string>();
    
    if (this.Cédula == "") mensajes.Add("Debe ingresar el Nº de cédula");
    if (this.Ruc == "") mensajes.Add("Debe ingresar el Nº de ruc");
    if (this.RazonSocial == "") mensajes.Add("Debe ingresar la razón social");
    if (this.Dirección == "") mensajes.Add("Debe ingresar la dirección");
    if (this.Ciudad == "") mensajes.Add("Debe ingresar el nombre de la ciudad");
    if (this.Teléfono == "") mensajes.Add("Debe ingresar el Nº de teléfono");
    if (this.Celular == "") mensajes.Add("Debe ingresar el Nº de movil");
    

    cuando usas este codigo, es n la capa de presentacion, y usas esta lista para validar si se llenaron todos los campos si es asi creas la entidad.

    Esta rara la logica. si necesitas comprobar que un objeto se construye con todas sus propiedades. por que no simplemente usas Constructores en cada entidad, que la entidad solo se cree si se envian los parametros para cada propiedad. eso es contruir el objeto.

    si no lo puede contruir entonces ahora si enviara el error y lo manjas con un try catch.

    miércoles, 13 de febrero de 2013 16:38