Mapeo de entidades por decoración

Si bien hace mucho que no dedico tiempo a publicar código, más que nada debido a mis estudios en Psicología, y por otra, tratando de criticar un poco el mundo del desarrollo de software por medio de dibujos, hace unos días algunos alumnos me pidieron plantear una forma en la cual se pudiera cargar datos desde una base de datos de una forma simple. Esto es, sin tener la necesidad de crear grandes mapeos o cantidad innumerable de objetos que hicieran una copia uno a uno de los datos recogidos desde un DataReader hacia las propiedades de una entidad.

Aquí les dejo algo del código que podría serles útil en su próxima implementación.

Primero, la clase que nos servirá para decorar las entidades:

[AttributeUsage(AttributeTargets.Property, AllowMultiple= false)]
public class EntityDecorations
: Attribute
{
public EntityDecorations(string mapName, Type convertType)
{
MapName = mapName;
ConvertType = convertType;
}

public string MapName { get; set; }

public Type ConvertType { get; set; }
}

Luego, una entidad para almacenar nuestros datos:

public class UserEntity
{
[EntityDecorations(”Id_User”, typeof(int))]
public int UserId { get; set; }

[EntityDecorations(”Username”, typeof(string))]
public string UserName { get; set; }

[EntityDecorations(”UserPassword”, typeof(string))]
public string Password { get; set; }

[EntityDecorations(”Name”, typeof(string))]
public string Name { get; set; }

[EntityDecorations(”LastName”, typeof(string))]
public string LastName { get; set; }
}

Ahora, una clase para leer los datos desde la base de datos y llenar nuestras entidades:

public class DataBaseProccesor
{
public Collection<T> ExecuteQuery<T>(string query, List<SqlParameter> parameters)
{
Collection<T> returnList = new Collection<T>();

SqlConnection conn = new SqlConnection();
SqlCommand comm = new SqlCommand();

conn.ConnectionString = ConfigurationManager.ConnectionStrings[”DB”].ToString();
comm.Connection = conn;
comm.CommandText = query;

if (parameters != null)
comm.Parameters.AddRange(parameters.ToArray<SqlParameter>());

conn.Open();

SqlDataReader dr = comm.ExecuteReader();

while (dr.Read())
{
T returnObject = Activator.CreateInstance<T>();

foreach (PropertyInfo prop in returnObject.GetType().GetProperties())
{
if (prop.GetCustomAttributes(typeof(EntityDecorations), false).Length != 0)
{
string mapName =
(prop.GetCustomAttributes(typeof(EntityDecorations), true)[0] as EntityDecorations).MapName;
Type castType =
(prop.GetCustomAttributes(typeof(EntityDecorations), true)[0] as EntityDecorations).ConvertType;

prop.SetValue(returnObject,
Convert.ChangeType(dr[mapName],
castType), null);
}
}

returnList.Add(returnObject);
}

dr.Close();
conn.Close();
dr.Dispose();
conn.Dispose();
comm.Dispose();

return returnList;
}
}

Y por último, una llamada para retornar información:

return new DataAccess.DataBaseProccesor().ExecuteQuery<UserEntity>(”select * from UserTable”, null);

Espero les sea de utilidad. Por supuesto, como todo código, siempre puede mejorarse.



Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s