Está en la página 1de 3

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 slo ser visible dentro del mbito de
/// la capa de Negocio y permitir a un objeto que la implemente
/// disponer de un mtodo 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 validacin 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 continuacin vamos a crear una Clase esttica en la cual vamos a crear un Mtodo 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 extrao aparece all HelperConverterExtensor.SetValue(property, instance, properties[index]); Esto pertenece a un anterior tutorial sobre Reflection que
estuvimos estudiando, ir a Refletion Ingphillips W ordPress, si buscas all encontraras la construccin de el Mtodo SetValue que permitir Setear los datos de un
objeto. Entonces si vemos simultneamente 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 parmetro almacenado en el arr ay(Se debe tener en cuenta el
orden de declaracin de las propiedades del objeto vrs el ndice de el parmetro en el arr ay de paramentros ejemplo Id equivale a parameters[0] ). Podramos
mejorar la eficiencia de esto a travs de un objeto IDictionary el cual permitira pasar la clave (Nombre de propiedad) y el valor respectivo a cada PropiedadTe
queda de tarea.
Por ltimo teniendo la construccin de lo que ser la validacin de datos para Insercin y actualizacin de registros en la tabla Person de la base de datos
DataBaseASP. Se aclara que esto slo tiene efectos acadmicos cualquiere problema de eficiencia y funcionalidad excluye al autor de alguna responsabilidad .
Pasemos a ver la definicin 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>
/// Enva 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 mtodo 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);
}
}
}

También podría gustarte