2012-01-20 7 views
0

私は、パブリッククラスからの単純な関数を持っています。MVCプロジェクトでハッシュテーブルをキャッシュ

この関数は、データベースから与えられた情報とHashtableオブジェクト、このような彼の機能の一部を作成:

try { 
      while (dataReader.Read()) { 
       Hashtable table1= new Hashtable(); 
       Hashtable table2= new Hashtable(); 

       table1.Add(dataReader["field1"].ToString(), Localization.English(dataReader["field1"]); 

       table2.Add(dataReader["field2"].ToString(), Localization.French(dataReader["field2"]); 
      } 
     } catch (Exception e) { 
      Console.WriteLine(e.Message); 
     } 

を私はこれらの2つのHashtable Sをキャッシュし、他のクラスでそれらを使用したいです。私が知っているように、System.Web名前空間を使ってもHttpRuntime.Cacheを使用することはできません。

HttpRuntime.CacheModelクラスで使用できることがわかりました。

これらをキャッシュする別の方法はありますかHashtable

PS:ご質問が悪い場合は申し訳ありません。

+0

の値を取得したい場合はその後、あなたはHttpRuntime.Cacheを使用するunsableている理由にelabortateすることはできますか? –

+0

'HttpRuntime.Cacheがモデルクラスで使用できることがわかりました。 –

+0

その他の注意事項; Webキャッシュがなんらかの理由で適切でない場合は、MemoryCache(またはそれに類似した名前)もあります。また、 'HashTable':全ての更新が同期されなければならないことに注意してください(読み込み**は同期させる必要はありません) –

答えて

1

モデルプロジェクトやエンティティプロジェクト、Webプロジェクトのように2つのプロジェクトがある場合は、モデルプロジェクトでSystem.Webに参照を追加するだけです。 System.Webへの参照を追加しなかった場合、System.Webの名前空間があっても、HttpRuntimeまたはHttpContectにアクセスすることはできません。

あなたがそうした後、あなたがアクセスしています:

System.Web.HttpRuntime.Cache 

をし、あなたはまた、

System.Web.HttpContext.Current.Application 

にアクセスすることができますし、使用することができます

HttpRuntime.Cache.Insert(
            CacheKey, 
            CacheValue, 
            null, 
            DateTime.Now.AddMinutes(CacheDuration), 
            Cache.NoSlidingExpiration 
           ); 

Hashtable table1 = HttpRuntime.Cache[CacheKey] as Hashtable; 
HttpRuntime.Cache.Remove(CacheKey); 

を使用することができます

System.Web.HttpContext.Current.Application.Add("table1",myHashTable); 
Hashtable table1 = System.Web.HttpContext.Current.Application["table1"] as Hashtable; 
1

静的クラスを使用することができます。

 public static class MyDictionary 
    { 
     public static Dictionary<string,string> French = new Dictionary<string,string>(); 

     public static Dictionary<string,string> English=new Dictionary<string,string>(); 
      public static MyDictionary(){ 
      while (dataReader.Read()) { 
      MyDictionary.English.Add(dataReader["field1"].ToString(),Localization.English(dataReader["field1"])); 
      MyDictionary.French.Add(dataReader["field2"].ToString(),Localization.French(dataReader["field2"])); 
      } 
     }   
     } 

あなたは言葉

MyDictionary.English["Car"]; // this'll return a string value. if contains 
MyDictionary.French["Car"]; // this'll return a string value. if contains 
+0

静的クラスを使用する場合は、読者をGlobal.asax/Application_Start。 MyDictionary用の静的コンストラクタを作成し、そこに値をロードするだけで済みます。これにより、初めてアプリケーションにアクセスするまでデータをロードする必要がなくなります。アプリケーションプールが循環する前に、Application_Startに配置されているものを実行する必要があります。より多くのアプリを起動する時間が長くなります。 –

+0

こんにちはスプラッシュX。あなたが正しいです。私はコンストラクタを考えなかった。コンストラクタはApplication_Startよりも良いアイデアです。 – halit

関連する問題