2009-08-21 4 views
0

Я работаю над приложением MVC asp.net.MethodInfo.Invoke иногда возвращает null и иногда возвращает значение

У меня есть класс, который обертывает репозиторий, который извлекает данные из db, используя простой оператор linq. Я написал класс декоратора, чтобы добавить логику кэширования (используя блок кэширования приложений).

, так как у меня есть несколько методов, которые я хочу украсить, и логика одинакова для каждого (проверьте, существует ли в кеше, если не вызывать реальный getter и хранить в кеше), я написал примерно так:

вспомогательный метод, который делает общую логику проверки, если существует в кэше, и так далее:

public object CachedMethodCall(MethodInfo realMethod, params object[] realMethodParams) 
    { 
     object result = null; 
     string cacheKey = CachingHelper.GenereateCacheKey(realMethod, realMethodParams); 

     // check if cache contains key, if yes take data from cache, else invoke real service and cache it for future use. 
     if (_CacheManager.Contains(cacheKey)) 
     { 
      result = _CacheManager.GetData(cacheKey); 
     } 
     else 
     { 
      result = realMethod.Invoke(_RealService, realMethodParams); 

      // TODO: currently cache expiration is set to 5 minutes. should be set according to the real data expiration setting. 
      AbsoluteTime expirationTime = new AbsoluteTime(DateTime.Now.AddMinutes(5)); 
      _CacheManager.Add(cacheKey, result, CacheItemPriority.Normal, null, expirationTime); 
     } 

     return result; 
    } 

это все работает отлично и прекрасно. в каждом украшенной метод У меня есть следующий код:

StackTrace currentStack = new StackTrace(); 
string currentMethodName = currentStack.GetFrame(0).GetMethod().Name; 
var result = (GeoArea)CachedMethodCall(_RealService.GetType().GetMethod(currentMethodName), someInputParam); 
return result; 

проблема, что иногда линия, где realMethod.Invoke (...) происходит возвращает нуль. Если я поставил точку останова сразу после, а затем вернул выполнение в эту строку, результат не будет нулевым, а данные будут извлечены из БД. все входные переменные верны, данные существуют в БД, 2-й прогон получает данные, так что идет не так в первом запуске ?!

спасибо :)

ответ

0

Я думаю, что мне удалось решить эту проблему путем обновления кода следующим образом:

public object CachedMethodCall(MethodInfo realMethod, params object[] realMethodParams) 
    { 
     string cacheKey = CachingHelper.GenereateCacheKey(realMethod, realMethodParams); 

     object result = _CacheManager.GetData(cacheKey); 

     if (result == null) 
     { 
      result = realMethod.Invoke(_RealService, BindingFlags.InvokeMethod, null, realMethodParams, CultureInfo.InvariantCulture); 

      // TODO: currently cache expiration is set to 5 minutes. should be set according to the real data expiration setting. 
      AbsoluteTime expirationTime = new AbsoluteTime(DateTime.Now.AddMinutes(5)); 
      _CacheManager.Add(cacheKey, result, CacheItemPriority.Normal, null, expirationTime); 
     } 

     return result; 
    } 

Я заметил, что предыдущий _CacheManager.Contains вызов иногда возвращает истину, даже если кэш не содержит данных. Я подозреваю, что проблемы вызывают проблемы, но я не уверен ...

Смежные вопросы