/// <summary> /// Constrói o cache. /// </summary> private CacheDb() { listaCache = new List<CacheDbItem>(tamanho); hashCache = new Dictionary<CacheDbChave,CacheDbItem>(tamanho); métodos = new MétodosRecuperação(); tmrManutenção = new Timer(1000 * 60 * 5); tmrManutenção.AutoReset = true; tmrManutenção.Elapsed += new ElapsedEventHandler(EfetuarManutenção); tmrManutenção.Start(); }
/// <summary> /// Recupera entidade do banco de dados. /// </summary> /// <param name="tipo">Tipo a ser recuperado.</param> /// <param name="parâmetros">Parâmetros para recuperar.</param> /// <returns></returns> private DbManipulação Recuperar(Type tipo, object[] parâmetros) { MethodInfo [] métodos; DbManipulação entidade = null; bool entidadeObtida = false; métodos = this.métodos[tipo]; foreach (MethodInfo método in métodos) { ParameterInfo [] métParâmetros; bool válido; #if DEBUG if (método == null) throw new Exception("Erro: método nulo encontrado.\n Isto provavelmente ocorreu porque existe atributos [Cacheável()] em algum classe sem o método correspondente. Dica: o método retorna objeto do tipo " + tipo.ToString() + " mas não necessáriamente o problema está nesta classe. "); #endif métParâmetros = método.GetParameters(); válido = métParâmetros.Length == parâmetros.Length; if (!válido) continue; foreach (ParameterInfo parâmetro in métParâmetros) if (parâmetros[parâmetro.Position] != null) válido &= parâmetro.ParameterType.Equals(parâmetros[parâmetro.Position].GetType()); else válido &= !parâmetro.ParameterType.IsValueType || parâmetro.ParameterType.GetGenericTypeDefinition() == typeof(Nullable<>); if (válido) { try { entidade = (DbManipulação) método.Invoke(null, parâmetros); entidadeObtida = true; } catch (TargetInvocationException e) { Console.WriteLine(e.InnerException.ToString()); throw new Exception(e.InnerException.Message, e); } if (entidadeObtida) break; } } if (!entidadeObtida) { entidadeObtida = RecuperarCompatibilidade(tipo, parâmetros, métodos, out entidade); if (!entidadeObtida) { entidadeObtida = RecuperarConvertendo(tipo, parâmetros, métodos, out entidade); if (!entidadeObtida) throw new Exception("Não foi possível encontrar um método válido para o conjunto de parâmetros passado."); } } return entidade; }