/// <summary> /// Obtém entidade do cache ou do banco de dados. /// </summary> /// <param name="tipo">Tipo da entidade.</param> /// <param name="parâmetros">Parâmetros para recuperação da entidade.</param> /// <returns>Entidade recuperada.</returns> public object ObterEntidade(Type tipo, params object[] parâmetros) { CacheDbItem item; CacheDbChave chave; bool emCache; DbManipulação entidade; chave = new CacheDbChave(tipo, parâmetros); int qtd; lock (this) { emCache = hashCache.TryGetValue(chave, out item); qtd = hashCache.Count; if (emCache) { if (item.Validade < DateTime.Now || item.Entidade == null) { #if DEBUG Console.WriteLine("Validade expirada: {0}; {1}", tipo.ToString(), item.Entidade != null ? item.Entidade.ToString() : "null"); #endif Remover(item); entidade = Recuperar(tipo, parâmetros); Adicionar(tipo, parâmetros, entidade); return entidade; } item.Usos++; #if DEBUG //string copia; //copia = item.Copiar ? " (A cópia será feita)" : ""; //if (item.Entidade != null) // Console.WriteLine("Reutilização {0} de item em cache: {2} {1}", item.Usos, item.Entidade.ToString(), copia); #endif if (item.Copiar) return Copiar(item); else return item.Entidade; } else { //Console.WriteLine("Infelizmente o item " + chave.ToString() + " não está em cache... só tenho " + hashCache.Count.ToString()); entidade = Recuperar(tipo, parâmetros); Adicionar(tipo, parâmetros, entidade); return entidade; } } }
/// <summary> /// Constrói um item do cache de banco de dados. /// </summary> /// <param name="entidade">Entidade do banco de dados.</param> /// <param name="validade">Validade do item no cache.</param> public CacheDbItem(DbManipulação entidade, DateTime validade, CacheDbChave chave) { this.entidade = entidade; this.validade = validade; this.chave = chave; this.criação = DateTime.Now; this.usos = 0; if (entidade == null) this.copiar = false; else { this.copiar = (entidade.GetType().GetCustomAttributes(typeof(NãoCopiarCache), true).Length == 0); if (copiar) this.entidade.Alterado += new DbManipulação.DbManipulaçãoHandler(AoAlterarEntidade); } }