Lo primero que debemos hacer antes de empezar es agregar la referencia del proyecto DataLayer.

dll a BusinessLayer, para esto ver video. Empecemos por crear una interface IValidable. Para esto agreguemos un template interface a BusinessLayer que debe lucir como sigue. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace BusinessLayer { /// <summary> /// Esta interface sólo será visible dentro del ámbito de /// la capa de Negocio y permitirá a un objeto que la implemente /// disponer de un método para validar n parametros que correspondan /// a cada una de sus Properies. Y mediante el parametro de referencia /// errors tener una cadena de errores relativos a la validación del objeto. /// /// En nuestro caso Person tendrá propiedades como /// Id /// PersonalId /// FirstName etc.. /// </summary> internal interface IValidable { bool Validate(ref string errors, params object[] parameters); } } Pero y para qué sirve esta interface?, a continuación vamos a crear una Clase estática en la cual vamos a crear un Método ext ensor para los tipos de objetos que implementen IValidable. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace BusinessLayer.Helpers { public static class HelperValidatorExtensor { internal static bool IsValid<T>(this T instance, ref string errors, params object[] properties) where T : IValidable { bool isValid = true; PropertyInfo[] props = instance.GetType().GetProperties(); if (isValid = properties.Length == props.Length) { int index = 0; foreach (var property in props) { Type t = property.GetType(); try { HelperConverterExtensor.SetValue(property, instance, properties[index]); } catch (Exception) { errors += "Error al convertir la cedena de texto a " + t.GetType() + "&"; } index++; } } else { errors += "El tipo " + instance.GetType().Name + " No contiene los paramentros necesarios para poder ser validado.&"; } return isValid; } } }

Algo extraño aparece allí HelperConverterExtensor.SetValue(property, instance, properties[index]); Esto pertenece a un anterior tutorial sobre Reflection que estuvimos estudiando, ir a Refletion Ingphillip’s W ordPress, si buscas allí encontraras la construcción de el Método SetValue que permitirá Setear los datos de un objeto. Entonces si vemos simultáneamente cuando se está validando el objeto que implementa IValidable , cada uno de los val ores correspondientes en este caso a Id, PersonalId , FirstName etc… ira tomando el valor correspondiente al índice de cada parámetro almacenado en el arr ay(Se debe tener en cuenta el orden de declaración de las propiedades del objeto vrs el índice de el parámetro en el arr ay de paramentros ejemplo Id equivale a parameters[0] )…. Podríamos mejorar la eficiencia de esto a través de un objeto IDictionary el cual permitiría pasar la clave (Nombre de propiedad) y el valor respectivo a cada Propiedad…Te queda de tarea…. Por último teniendo la construcción de lo que será la validación de datos para Inserción y actualización de registros en la tabla Person de la base de datos DataBaseASP. Se aclara que esto sólo tiene efectos académicos cualquiere problema de eficiencia y funcionalidad excluye al autor de alguna responsabilidad . Pasemos a ver la definición de la clase Person en la capa de negocio. Las clases creadas hasta este pundo se debieron haber agregado a BudinessLayer

using System; using System.Collections.Generic; using System.Linq; using System.Text; using BusinessLayer.Helpers; using System.Data; namespace BusinessLayer { public class PersonBL : IValidable { public int Id { get; set; } public int PersonalId { get; set; } public string FirstName { get; set; } private string secondName; public string SecondName { get { return secondName; } set { if (value == null) value = string.Empty; secondName = value; } } public string FirstLastName { get; set; } private string secondLastName; public string SecondLastName { get { return secondLastName; } set { if (value == null) value = string.Empty; secondLastName = value; } }

/// <summary> /// Retorna un objeto DataTable con el resultado de la consutla /// en la base de datos. /// </summary> public DataTable GetAllPeople(ref string errors) { DataLayer.Person person = new DataLayer.Person(); DataTable dt = person.GetAllPeople(ref errors); return dt; } /// <summary> /// Hace las validaciones de los datos de la clase PersonBL /// y envia a la Capa de Datos a la clase encargada de /// insertar los datos en la base de datos /// </summary> public bool Insert(ref string errors, params object[] parameters) { bool isValid = Validate(ref errors, parameters); if (isValid) { DataLayer.Person person = new DataLayer.Person(); person.Insert(ref errors, Id, PersonalId, FirstName, SecondName, FirstLastName, SecondLastName); return string.IsNullOrEmpty(errors); } return isValid; } /// <summary> /// Hace las validaciones de los datos de la clase PersonBL /// y envia a la Capa de Datos a la clase encargada de /// actualizar los datos en la base de datos /// </summary> /// <param name="errors"></param> /// <param name="parameters"></param> /// <returns></returns> public bool Update(ref string errors, params object[] parameters) { bool isValid = Validate(ref errors, parameters); if (isValid) { DataLayer.Person person = new DataLayer.Person(); person.Update(ref errors, Id, PersonalId, FirstName, SecondName, FirstLastName, SecondLastName); return string.IsNullOrEmpty(errors); } return isValid; } /// <summary> /// Envía el id relativo a un registro de la tabla Person /// a la capa de Datos para lanzar la sentencia Delete /// </summary> public bool Delete(ref string errors, int id) { DataLayer.Person person = new DataLayer.Person(); person.Delete(ref errors, id); return string.IsNullOrEmpty(errors); } /// <summary> /// Metodo implementado de IValidable para validar un /// objeto mediante el método extensor IsValid /// </summary> /// <param name="errors"></param> /// <param name="parameters"></param> /// <returns></returns> public bool Validate(ref string errors, params object[] parameters) { return this.IsValid(ref errors, parameters); } } }

Sign up to vote on this title
UsefulNot useful