示例#1
0
		/// <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();
		}
示例#2
0
		/// <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;
		}