我正在开发一个 asp.net MVC 应用程序。
我有一个类,它包装了一个使用简单的 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(...)
发生的行返回null。如果我在之后放置一个断点,然后将执行返回到该行,则结果不为空,并且从数据库中获取数据。所有输入变量都正确,数据库中存在数据,第二次运行获取数据,那么第一次运行出现什么问题?!
谢谢 :)