2012-12-21 30 views
8

Tôi hơi bối rối khi hiểu về phương pháp tiếp cận HttpCache và Singleton.HttpCache vs Singleton - Thực tiễn tốt nhất cho ứng dụng MVC

Ứng dụng của tôi sử dụng Asp.net MVC và kịch bản là, tôi có một số Danh sách dữ liệu sẽ không bao giờ thay đổi và một số dữ liệu hiếm khi có thể thay đổi.

Tôi đã phát triển và triển khai ứng dụng bằng cách sử dụng kho lưu trữ Singleton cho loại dữ liệu này. Nó hoạt động rất tốt. Vấn đề duy nhất là khi một trường hợp hiếm xảy ra, tôi phải khởi động lại IIS để có hiệu lực.

Giải pháp tốt nhất là gì?

Singleton thực hiện

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

Singleton của bạn được triển khai như thế nào? Liệu nó chỉ lưu trữ dữ liệu trong bộ nhớ (là thành viên lớp)? Bạn có phải khởi động lại IIS sau khi thay đổi dữ liệu hiếm khi thay đổi để làm cho nó hiển thị cho người dùng không? – danludwig

+0

Có, Dữ liệu được lưu trữ trong đối tượng IList . và chỉ sau khi IIS khởi động lại các thay đổi được phản ánh. –

Trả lời

8

Mục đích của việc sử dụng mô hình singleton nói chung không phải là để lưu trữ dữ liệu tĩnh. Bạn nên sử dụng một singleton khi bạn chỉ muốn một cá thể đối tượng để có thể thực hiện một số hành động nhất định. Nó có thể nhanh, nhưng như bạn có thể thấy, khi dữ liệu thay đổi, bạn cần phải thiết lập lại heap để lấy dữ liệu mới (như bạn nói, bằng cách khởi động lại IIS).

HttpCache (cụ thể hơn, ObjectCache mà Http caching sử dụng theo mặc định), lưu trữ dữ liệu ở cùng vị trí với vùng lưu trữ: trong Bộ nhớ truy cập ngẫu nhiên. Vì vậy, nó chỉ là nhanh như dữ liệu tĩnh được lưu trữ trong một lớp hoặc thể hiện trên heap. Sự khác biệt là bạn có thể thiết lập bộ nhớ cache để định kỳ đi cũ, để nó sẽ nhận được dữ liệu mới khi dữ liệu thay đổi. Bạn thậm chí có thể thiết lập SqlCacheDependencies để cache được tạo cũ bất cứ khi nào trạng thái cơ sở dữ liệu của bạn thay đổi.

Một ưu điểm khác của bộ nhớ cache là sử dụng tài nguyên RAM của máy chủ hiệu quả hơn. Với singleton của bạn, không có vấn đề gì, dữ liệu này sẽ luôn luôn chiếm bộ nhớ, ngay cả khi dữ liệu không được sử dụng. Với bộ nhớ cache, máy chủ chỉ lưu trữ dữ liệu trong bộ nhớ khi nó đang được sử dụng. Những bất lợi với bộ nhớ cache là đôi khi, một người sử dụng ở đây và sẽ nhận được một phản ứng chậm hơn khi họ yêu cầu dữ liệu sau khi bộ nhớ cache đã hết hạn. Tuy nhiên, sau khi họ làm, người dùng khác sẽ được hưởng lợi từ dữ liệu được lưu trữ trong một thời gian.

+1

Tôi chỉ sử dụng Singleton bởi vì tôi không muốn bất kỳ đúc không mong muốn nào có hiệu suất vượt trội. Vì vậy, chỉ cần đặt tất cả các đối tượng Danh sách trong bộ nhớ. nhưng tôi nghĩ rằng thay vì sử dụng danh sách chỉ đọc, tôi có thể sử dụng phương pháp lai bằng cách sử dụng phụ thuộc vào bộ nhớ đệm để thông báo cho tôi về thay đổi dữ liệu và xử lý văn bản để sửa đổi dữ liệu Danh sách của tôi..Xin vui lòng sửa. –

+0

câu trả lời cho đó là chính xác những gì tôi đang tìm kiếm là tốt. –

3

Bạn thực sự có thể tải lại singleton bằng cách tạo ra một phương pháp tải lại như thế này:

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

Hy vọng rằng sẽ giúp.

Các vấn đề liên quan