2012-12-21 15 views
8

HttpCacheとSingletonのアプローチを理解するのは少し混乱します。HttpCache対シングルトン - MVCアプリケーションのベストプラクティス

私のアプリケーションではAsp.net MVCが使用されていますが、シナリオはそれほど変わらないデータリストとほとんど変更されないデータがあります。

私はこのタイプのデータに対してシングルトンリポジトリを使用してアプリケーションを開発し、配備しました。 それは素晴らしい行います。唯一の問題は、まれなケースが発生した場合、IISを再起動して有効にする必要があることです。

最適な解決策は何ですか?

シングルトン実装

public class SingletonRepository : ISingletonRepository 
    { 
     private static SingletonRepository singleInstance; 

     private readonly IStateRepository stateRepo; 
     private readonly ICountryRepository countryRepo; 
     private readonly ITDPaymentModeRepository paymentModeRepo; 
     private readonly ITDPlanRepository planRepo; 
     private readonly ITDOrderTypeRepository orderTypeRepo; 
     private readonly IKeywordRepository keywordRepo; 
     private readonly IAgencyRepository agencyRepo; 

     private readonly IList<AT_STATE> lstState; 
     private readonly IList<AT_COUNTRY> lstCountry; 
     private readonly IList<TDPaymentMode> lstPaymentMode; 
     private readonly IList<TDPlan> lstPlan; 
     private readonly IList<TDOrderType> lstOrderType; 
     private readonly IList<Keyword> lstKeyword; 
     private readonly IList<Agency_MST> lstAgency; 

     private SingletonRepository() 
     { 
      stateRepo = new StateRepository(); 
      countryRepo = new CountryRepository(); 
      paymentModeRepo = new TDPaymentModeRepository(); 
      planRepo = new TDPlanRepository(); 
      orderTypeRepo = new TDOrderTypeRepository(); 
      keywordRepo = new KeywordRepository(); 
      agencyRepo = new AgencyRepository(); 

      lstState = stateRepo.GetAll().Where(x => x.CountryId == 101).ToList(); 
      lstCountry = countryRepo.GetAll().ToList(); 
      lstPaymentMode = paymentModeRepo.GetAll().ToList(); 
      lstPlan = planRepo.GetAll().ToList(); 
      lstOrderType = orderTypeRepo.GetAll().ToList(); 
      lstKeyword = keywordRepo.GetAll().ToList(); 
      lstAgency = agencyRepo.GetAll().ToList(); 

      //lstState = stateRepo.GetAll().Take(20).ToList(); 
      //lstCountry = countryRepo.GetAll().Take(20).ToList(); 
      //lstPaymentMode = paymentModeRepo.GetAll().Take(20).ToList(); 
      //lstPlan = planRepo.GetAll().Take(20).ToList(); 
      //lstOrderType = orderTypeRepo.GetAll().Take(20).ToList(); 
      //lstKeyword = keywordRepo.GetAll().Take(20).ToList(); 
      //lstAgency = agencyRepo.GetAll().Take(20).ToList(); 
     } 

     public static SingletonRepository Instance() 
     { 
      return singleInstance ?? (singleInstance = new SingletonRepository()); 
     } 

     public IList<AT_STATE> GetState() 
     { 
      return this.lstState; 
     } 
     public IList<AT_COUNTRY> GetCountry() 
     { 
      return this.lstCountry; 
     } 

     public IList<TDPaymentMode> GetPaymentMode() 
     { 
      return this.lstPaymentMode; 
     } 

     public IList<TDPlan> GetPlan() 
     { 
      return this.lstPlan; 
     } 

     public IList<TDOrderType> GetOrderType() 
     { 
      return this.lstOrderType; 
     } 

     public IList<Keyword> GetKeyword() 
     { 
      return this.lstKeyword; 
     } 

     public IList<Agency_MST> GetAgency() 
     { 
      return this.lstAgency; 
     }  

    } 

}

+0

シングルトンはどのように実装されていますか?データをクラスメンバーとしてメモリに格納するだけですか?まれに変更されたデータがユーザーに表示されるように変更した後にIISを再起動する必要がありますか。 – danludwig

+0

はい、データはIList オブジェクトに格納されます。 IISの再起動後にのみ変更が反映されます。 –

答えて

8

シングルトンパターンを使用する目的は、一般的に静的なデータ記憶のためではありません。 1つのオブジェクトインスタンスが特定のアクションを実行できるようにする場合は、シングルトンを使用する必要があります。速いかもしれませんが、データが変わったときには、新しいデータを取得するためにヒープをリセットする必要があります(たとえば、IISを再起動するなど)。

HttpCache(より具体的には、Httpキャッシングがデフォルトで使用するObjectCache)は、ヒープと同じ場所にデータを格納します。ランダムアクセスメモリ。したがって、ヒープ上のクラスまたはインスタンスに格納されている静的データと同じくらい速いです。違いは、データが変更されたときに新しいデータを取得できるように、定期的にキャッシュが古くなるように設定できることです。データベースの状態が変わるたびにキャッシュが失効するようにSqlCacheDependenciesを設定することもできます。

キャッシュのもう1つの利点は、サーバーのRAMリソースをより効率的に利用できることです。シングルトンでは、たとえデータが使用されていなくても、このデータは常にメモリを占有します。キャッシュを使用すると、サーバーはデータが使用されているときにのみメモリーにデータを保管します。キャッシュの欠点は、キャッシュの有効期限が切れた後にデータを要求するときに、ここでの応答が遅くなることがあります。しかし、その後、他のユーザーは、データが一度にキャッシュされることで恩恵を受けることになります。

+1

私はシングルトンを使用しました。なぜなら、私はオーバーヘッドのパフォーマンスを望まないキャスティングを望んでいないからです。したがって、すべてのListオブジェクトをメモリに格納するだけです。私はむしろreadonlyリストを使用すると思う、私はキャッシュ変更を使用して私のリストのデータを変更するためにデータの変更と書き込みハンドルを通知するハイブリッドアプローチを使用することができます。 –

+0

それはまさに私が探しているものです。 –

3

あなたが実際にこのようなリロード方法を作成することによって、シングルトンをリロードすることができます

public static void ReloadSingletonRepositoryInstance() 
{ 
    singleInstance = null; 
    SingletonRepository sr = SingletonRepository.Instance; 
} 

お役に立てば幸いです。