2011-07-08 15 views
0

共有オブジェクトをasp.netに保存する最良の方法は何ですか?リクエストごとにリクエストごとに複数回呼び出されます。私はこれらの2つの方法を使用していましたが、IDはより良い方法があるかどうかを知りたいと思っています。私はこのオブジェクトを1時間に1回リフレッシュします。静的またはキャッシュとしてasp.netオブジェクトを共有

public static List<ResourceObject> SharedResources = new List<ResourceObject>() 

//OR 

public static List<ResourceObject> SharedResources 
{ 
    get 
    { 
     List<ResourceObject> _sharedResources = HttpContext.Current.Cache["RedirectRoutes"] as List<ResourceObject>; 
     if (_sharedResources == null) 
     { 
      _sharedResources = LoadNewSharedResource(); 
      HttpContext.Current.Cache["RedirectRoutes"] = _sharedResources; 
     } 

     return _redirectRoutes; 
    } 
    set 
    { 
     HttpContext.Current.Cache["RedirectRoutes"] = value; 
    } 
} 
+2

あなたの正確なニーズに応じて、どちらも十分に見えます。しかし、何かが返された 'List '(要素の追加/削除など)を変更している場合は、問題が発生する可能性があることに注意してください。突然変異を防ぐために 'ReadOnlyCollection 'のようなものを返す方が良いでしょう。 – LukeH

+0

私は実際には「セット」を通常は外しています。そう、私はこの問題を防ぐと思います。 – zeal

+1

いいえ、リファレンスの割り当てはパブリックフィールドの場合はアトムで保証され、ASP.NETのCacheクラスはスレッドセーフであることが保証されているので(プロパティの場合)、セットは実際にはOKです。私が言っているのは 'SharedResources.Add(/ * something * /)'、 'SharedResources.RemoveAt(0)'などです。これらはマルチスレッド環境では実行時に失敗する可能性があります。 – LukeH

答えて

2

あなたのオブジェクトが頻繁に変更されている場合(言い換えれば1時間ごと)、フラッシュを処理できるようにキャッシュを使用することをお勧めします(値を追加するときに正しいパラメータを渡すと仮定します)キャッシュへ)。静的な値を使用すると、1時間ごとに自動的にクリアされないので、自分でチェックを実装する必要があります。

1

これは、見た目のとおり、要求を超えて持続する必要があるオブジェクトであれば、これを達成するための完全に良好で合理的な方法です。 1回の呼び出しでキャッシュされたバージョンが複数回アクセスされた場合は、そのキャッシュされたバージョンをローカル変数に入れて、そのたびにキャッシュからの取得を保存することができます。

あなたの懸念しているようなキャッシュに問題がありますか?

+0

私は主に静的オブジェクトだけを使用し、それをキャッシュに格納しないことを心配していました。私はちょうど私がしていたことが眉をひそめられていないという安心感が必要だったと思う。 – zeal

+0

それは私に怒らないでください。 –

関連する問題