0

我有一个用 C# 编写的函数,它在检查并插入缓存后返回业务实体(make)的集合。

  public static Collection<CProductMakesProps> GetCachedSmartPhoneMake(HttpContext context)
    {
        var allMake = context.Cache["SmartPhoneMake"] as Collection<CProductMakesProps>;
        if (allMake == null)
        {
            context.Cache.Insert("SmartPhoneMake", new CModelRestrictionLogic().GetTopMakes(), null,
                                 DateTime.Now.AddHours(Int32.Parse(ConfigurationManager.AppSettings["MakeCacheTime"])),
                                 Cache.NoSlidingExpiration);

            allMake = context.Cache["SmartPhoneMake"] as Collection<CProductMakesProps>;
        }
        return allMake;
    }

我在其他页面中使用它如下

 var lobjprodMakeCol = CBrandCache.GetCachedSmartPhoneMake(Context);
 //CBrandCache is the class which contain the method 

我是否有可能在lobjprodMakeCol

谢谢。


编辑

Notenew CModelRestrictionLogic().GetTopMakes()是一个从数据库中获取记录的函数。
它将返回计数为 0 或更多的集合天气。

4

2 回答 2

1

是的,有可能,如果强制as Collection<CProductMakesProps>转换失败,则会将 null 分配给allMake,因此这在很大程度上取决于您从 . 返回的内容new CModelRestrictionLogic().GetTopMakes()

基于大多数缓存和/或字典集合将允许您检查特定键的存在的假设,我建议使用一种更简化的方式来编写此代码:

public static Collection<CProductMakesProps> GetCachedSmartPhoneMake(HttpContext context)
{
    if (!context.Cache.ContainsKey("SmartPhoneMake") || context.Cache["SmartPhoneMake"] == null)
    {
        context.Cache.Insert("SmartPhoneMake"
                             , new CModelRestrictionLogic().GetTopMakes()
                             , null
                             , DateTime.Now.AddHours(Int32.Parse(ConfigurationManager.AppSettings["MakeCacheTime"]))
                             , Cache.NoSlidingExpiration);
    }

    return context.Cache["SmartPhoneMake"] as Collection<CProductMakesProps>;
}
于 2012-12-27T05:26:08.127 回答
1

当您的函数返回 null 时,可能性很小 - 它们是

  1. GetTopMakes函数它自己返回 null
  2. 缓存过期时间为零(MakeCacheTime配置条目的值为零)
  3. 转换as Collection<CProductMakesProps>失败 - 如果GetTopMakes 返回一些不同的类型,则可能。

我更喜欢在上述所有情况下都不会返回 null 的以下版本

var allMake = context.Cache["SmartPhoneMake"] as Collection<CProductMakesProps>;
if (allMake == null)
{
   allMake = new CModelRestrictionLogic().GetTopMakes();
   context.Cache.Insert("SmartPhoneMake", allMake, 
      null, DateTime.UtcNow.AddHours(Int32.Parse(
      ConfigurationManager.AppSettings["MakeCacheTime"])), Cache.NoSlidingExpiration);
}
return allMake;

另请注意,使用DateTime.UtcNow它可以避免任何意外,例如夏令时等。

于 2012-12-27T06:13:09.103 回答