Exemplo n.º 1
0
		/// <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;
                }
            }
        }
Exemplo n.º 2
0
		/// <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);
            }
		}