Utilizando System.Reflection e System.Attributes para a construção de uma Ferramenta ORM - Parte 7

Construção de uma ferramenta ORM tendo como base os recursos contidos nas Namespaces System.Reflection e System.Attributes entre outras etc.

Nesta parte do artigo, disponibilizaremos o código completo da classe DAL Genérica.

namespace GenDAL.Library.DataBaseLib.GenericDAL {public class GenericDAL where T : IBaseModel, new() { public class GenericDALException : Exception { public string ErrorMessage { get { return base.Message; } } public GenericDALException(string errorMessage) : base(errorMessage) { } public GenericDALException(string errorMessage, Exception innerException) : base(errorMessage, innerException) { } } private DBManager _dbManager; protected DBManager TransactionScope() { DBManager man = new DBManager(); this._dbManager = man; return man; } protected DBManager TransactionScope(string currentConn) { DBManager man = new DBManager(currentConn); this._dbManager = man; return man; } private string GetFieldName(PropertyInfo piInfo) { string retorno = ""; foreach (object attributo in piInfo.GetCustomAttributes(false)) { if (attributo is AttFieldDB) { retorno = ((AttFieldDB)attributo).FieldName; break; } } return retorno; } private void SetPropertyValue(DataRow row, PropertyInfo piInfo, T obj) { foreach (DataColumn col in row.Table.Columns) { if (col.ColumnName.ToLower().Equals(this.GetFieldName(piInfo).ToLower())) { if (piInfo.PropertyType.Module.ScopeName.ToLower().Equals("commonlanguageruntimelibrary")) { if (row[col] != DBNull.Value) { piInfo.SetValue(obj, Convert.ChangeType(row[col], piInfo.PropertyType), null); break; } } } } } private List DataSetToList(DataSet ds) { T obj = new T(); List retorno = null; try { if (ds != null && ds.Tables[0].Rows.Count > 0) { retorno = new List(); foreach (DataRow dr in ds.Tables[0].Rows) { obj = new T(); foreach (PropertyInfo piAux in obj.GetType().GetProperties()) { SetPropertyValue(dr, piAux, obj); } retorno.Add(obj); } } } catch (Exception ex) { throw ex; } finally { obj = default(T); } return retorno; } private void ValidateUsageCustomAttributes() { T obj = default(T); string methodName = "ValidateUsageCustomAttr"; try { obj = new T(); MethodInfo minfo = obj.GetType().GetMethod(methodName); if (minfo != null) { minfo.Invoke(obj, null); } } catch (Exception ex) { throw ex; } } private void ExecProc(T pObj, ProcedureTypes pProcType) { object[] atributos = null; AttParamProcDB attProcDB = null; IDbCommand command = null; IDbDataParameter param = null; bool flagHasParamOut = false; try { //Valida o uso dos atributos this.ValidateUsageCustomAttributes(); if (pProcType != ProcedureTypes.SelectFilter && pProcType != ProcedureTypes.SelectNoFilter) { if (this._dbManager == null || this._dbManager.Conn == null) { throw new GenericDALException("Utilize um dos métodos 'TransactionScope' para setar o escopo da transacao atual"); } foreach (PropertyInfo piInfo in pObj.GetType().GetProperties()) { atributos = piInfo.GetCustomAttributes(false); if (atributos != null && atributos.Length > 0) { foreach (object att in atributos) { if (att is AttParamProcDB) { attProcDB = (AttParamProcDB)att; if (attProcDB.TipoProcedure == pProcType) { if (command == null || String.IsNullOrEmpty(command.CommandText)) { command = this._dbManager.Conn.CreateCommand(); //this._conn.CreateCommand(); command.CommandType = CommandType.StoredProcedure; command.CommandText = attProcDB.ProcName; command.Transaction = this._dbManager.Trans; // this._transaction; } if (command != null) { param = command.CreateParameter(); param.ParameterName = attProcDB.ParamName; param.DbType = attProcDB.DbType; param.Direction = attProcDB.Direction; if (attProcDB.Direction == ParameterDirection.Input) { param.Value = piInfo.GetValue(pObj, null); } else { flagHasParamOut = true; piInfo.SetValue(pObj, param.Value, null); param.Size = attProcDB.ParamSize; } command.Parameters.Add(param); } } } } } } /*---------Preenche Outputs----------*/ if (command.Parameters != null) { command.ExecuteNonQuery(); if (flagHasParamOut) { foreach (IDataParameter paramAx in command.Parameters) { foreach (PropertyInfo piAux in pObj.GetType().GetProperties()) { foreach (object attObj in piAux.GetCustomAttributes(false)) { if (attObj is AttParamProcDB) { if (((AttParamProcDB)attObj).TipoProcedure == pProcType && ((AttParamProcDB)attObj).Direction == ParameterDirection.Output ) { if (paramAx.ParameterName.ToLower() == ((AttParamProcDB)attObj).ParamName.ToLower()) { if (paramAx.Value != null) { piAux.SetValue(pObj, paramAx.Value, null); } } } } } } } } } } } catch (Exception ex) { this._dbManager.Dispose(); throw ex; } finally { atributos = null; attProcDB = null; command = null; param = null; } }

Continuaremos a classe no próximo artigo

Artigos relacionados