2009-08-21 11 views
0

Je travaille sur une application asp.net MVC.MethodInfo.Invoke renvoie parfois la valeur null et renvoie parfois la valeur

J'ai une classe qui enveloppe un référentiel qui extrait des données d'une base de données en utilisant une simple instruction linq. J'ai écrit une classe de décorateur pour ajouter une logique de mise en cache (en utilisant un bloc d'application de mise en cache).

depuis que j'ai plusieurs méthodes que je veux décorer, et la logique est la même pour chacun (vérifier si existe en cache, sinon invoquer getter réel et stocker en cache), j'ai écrit quelque chose comme:

une méthode d'assistance qui fait la logique commune de vérifier si elle existe dans le cache et ainsi de suite:

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; 
    } 

tout cela fonctionne très bien et belle. dans chaque méthode décorée je le code suivant:

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

le problème est que parfois la ligne où realMethod.Invoke (...) se produit retourne null. Si je mets un point d'arrêt juste après, puis que je renvoie l'exécution à cette ligne, le résultat n'est pas nul et les données sont extraites de la base de données. toutes les variables d'entrée sont correctes, les données existent dans la base de données, la 2ème exécution obtient les données, alors qu'est-ce qui ne va pas dans la première exécution ?!

merci :)

Répondre

0

Je pense que je réussi à résoudre ce problème en mettant à jour le code comme suit:

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; 
    } 

je remarquai que l'appel précédent de _CacheManager.Contains revenait parfois vrai même si le cache ne contient pas les données. Je suspecte des discussions causant les problèmes, mais je ne suis pas sûr ...

Questions connexes