這是我的場景。C#ASP.NET MVC的Windows服務NULL空數據層中的靜態實例屬性?
我有3個項目的ASP.NET MVC的解決方案。數據,Web和Windows服務。數據層具有靜態(非線程安全)屬性,它會一次獲取數據,否則將存儲在靜態專用字段中。見下:
private static int? _userCount;
public static int UserCount
{
get
{
if (!_userCount.HasValue)
{
_userCount = GetUserCount();
}
return _userCount.Value;
}
set
{
_userCount = value;
}
}
這對我的需求很好。在Web層中,每次添加新用戶時,我都會在數據層中調用服務方法,並設置UserCount = NULL
因此,下次訪問網站時,它將獲取新計數。這也如預期般運作。
我也有一個Windows服務,可以通過導入過程中創建用戶。它調用與web層一樣的SaveUser
方法,它應該再次清除UserCount屬性。然後,我會認爲我應該可以在網站上刷新頁面,並重新獲得新的用戶數。然而,這種情況並非如此。
我可以瀏覽代碼並看到服務點擊了UserCount = NULL
,但是即使它調用的是同一個屬性,它的網頁層也不會識別它。
我必須做的IIS重置隨時隨地Windows服務帶來的用戶,以便以清除靜態屬性。有關爲什麼這種行爲與在服務中創建用戶或在Web層上通過UI創建行爲不同的想法?
感謝您的回答格雷格。你有一切權利,但我沒有留下一件事。服務本身使用反射來創建處理數據層的類的實例。那些處理類(在數據層中)然後調用與Web相同的CreateUser方法。上面的簡短答案是否保持不變? – aherrick 2011-06-09 18:27:58
每個靜態實例在特定的進程空間內只是靜態的。即使這兩個對象都是通過反射在兩個地方實例化,它們仍然生活在一定的空間內。您可以通過包裝功能(例如)的服務來解決這個問題,但這只是將靜態實例遷移到由具有自己的進程空間的兩個應用程序調用的單個進程空間(服務)。 – 2011-06-10 19:40:12