0

チェックしてキャッシュに挿入した後、ビジネスエンティティ(make)のコレクションを返すC#で記述された関数があります。

  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 

でnull値を取得することは可能ですかlobjprodMakeCol

ありがとう。


編集

new CModelRestrictionLogic().GetTopMakes()は、データベースからレコードをフェッチする関数です。
count 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 に答える