背景/問題:C#類庫 - Singleton設計模式
我是相當新的Singleton設計模式。我已經在Web應用程序中使用一次(與SO社會的幫助下):
public static AppGlobal Instance
{
get
{
if (HttpContext.Current.Session != null)
{
HttpSessionState session = HttpContext.Current.Session;
if (session["AppGlobalInstance"] == null)
{
session["AppGlobalInstance"] = new AppGlobal();
}
return (AppGlobal)session["AppGlobalInstance"];
}
else
{
return null;
}
}
}
上述實施對我來說很有意義,因爲AppGlobal
的實例存儲在會話中。當會話消失時,AppGlobal
死亡。如果我在由Web應用程序調用的類庫中使用相同的設計模式,會發生什麼情況?例如,用戶請求一個調用不知道會話的DLL中的方法的頁面。存儲在單例實例中的數據是否會通過多次調用持續存在?
private static readonly Singleton instance = new Singleton();
private Singleton() { }
public static Singleton Instance
{
get
{
return instance;
}
}
附加信息:
這裏就是我要完成的:我有一個要接收來自第三方應用XML請求的Web應用程序。這個XML將告訴我的Web應用程序執行三件事中的一件(或全部三件)。我想有一個類的單例實例存儲可以被多個類訪問的數據。我希望每個請求後單例實例到DIE。如果上述內容沒有完成這個,那麼完成它的最好方法是什麼?
注意:此Web應用程序在單個服務器上運行,並且從不在服務器場上運行。
編輯1:
基於下面的建議下,我用System.Web.HttpContext.Current.Session
來存儲我的類的實例。這看起來像是對每個會話都是獨一無二的單身人士的正確方法嗎(記得我在一個班級圖書館裏)?
public static Ariba Instance
{
get
{
if (HttpContext.Current.Session != null)
{
HttpSessionState session = HttpContext.Current.Session;
if (session["AribaInstance"] == null)
{
session["AribaInstance"] = new Ariba();
}
return (Ariba)session["AribaInstance"];
}
else
{
return null;
}
}
}
你提到你希望在每個**請求**後單身死亡。如果是這樣的話,你不需要在會話中存儲任何東西。相反,您可以將對象存儲在HttpContext.Current.Items [「AribaInstance」]中。我會補充一點,如果你使用HttpContext.Current,你將會遇到一些單元測試你的類庫的困難,因爲HttpContext.Current不會被填充到ASP.NET之外(Session也是如此)。如果單元測試對你很重要,你需要包裝上下文和會話對象。 –
@AndyWilson,謝謝你的領導,併爲答案! –