2008-11-19 63 views
4

我在.NET中創建了一個註冊表類,它是一個單例。顯然,這個單例表現得好像它被保存在緩存中一樣(單例對象可用於每個會話)。這是一個很好的做法,我應該將這個單例添加到緩存? +我需要用GetInstance()函數來解決併發問題嗎?Singleton vs Cache ASP.NET

namespace Edu3.Business.Registry 
{ 
    public class ExamDTORegistry 
    { 
     private static ExamDTORegistry instance; 
     private Dictionary<int, ExamDTO> examDTODictionary; 

     private ExamDTORegistry() 
     { 
      examDTODictionary = new Dictionary<int, ExamDTO>(); 
     } 

     public static ExamDTORegistry GetInstance() 
     { 
      if (instance == null) 
      { 
       instance = new ExamDTORegistry(); 
      } 
      return instance; 
     } 
    } 
} 

回答

0

我會讓喜歡:

私人靜態只讀ExamDTORegistry實例;

那麼你不需要檢查NULL和它的線程安全。

5

那麼,你的getInstance方法肯定不是線程安全的 - 如果兩個線程調用它在同一時間,他們可能會用兩種不同的情況下結束。如果有幫助,我有page on implementing the singleton pattern

請問您的代碼依賴於它是一個單?請記住,如果AppDomain重新加載,無論如何你都會得到一個新的實例。

雖然我並沒有真正看到將對象放入緩存的好處。有什麼特別的想法嗎?

+0

Yeps,當AppDomain重新加載時,新實例沒有問題。但是一個單身人士確實表現得像一個全球物體,不是嗎?在測試時,我可以看到ASP.NET不會爲每個會話創建一個單例,而只是整個應用程序的一個單例。 – 2008-11-19 15:37:14

5

儘管他們在GoF的單身存在通常被認爲是bad practice。你有什麼理由只想要只有一個實例嗎?

+0

在正確的地方使用這是一個很好的做法。不幸的是,我從來沒有在一個真正需要*的地方工作,但我已經看到他們實施了數百次:) MonoState是一個很好的選擇。 – 2008-11-19 14:41:53

+0

事實上,在互聯網上百位的討論...... – 2008-11-19 15:41:45

0

不知道知道你的緩存是什麼意思...如果你想這個緩存的(如...保持它在內存中,這樣你就不必從一些數據存儲再次讀取它),然後是的,你可以將其放入緩存中,並且對所有用戶都是全球的。會話意味着每個用戶,所以我不認爲這是你想要的。

2

HttpContext.Cache是​​提供給所有會話,但在高速緩存中的項目可以從內存中時,他們到期,或者有內存壓力被移除。

HttpContext.Application也提供給所有會話,並存儲持久性,應用範圍的對象的好地方。

既然你已經創建了一個單身和它的作品,我不明白爲什麼要使用內置單集合,而不是,除非你需要額外的功能,緩存爲您提供者之一。