2011-06-09 17 views
1

這是我的場景。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創建行爲不同的想法?

回答

2

讓我看看我是否有這樣的筆直。您有一個處理保存用戶的庫,它會清除計數值。它適用於MVC,但不適用於Windows服務,因爲它在MVC應用程序中不會被視爲空。

如果我有正確的,讓我更加明確。您有一個庫來處理您的MVC應用程序正在使用的用戶。 Windows服務也使用相同的庫。

如果我有正確的,你得到的東西不工作的原因。如果你堅持靜態,開始思考進程邊界並詢問「MVC應用程序是否使用與Windows服務相同的進程」?

短的答案:如果該功能是在一個庫中,由兩個獨立的應用中使用,它被正確地表現,因爲每個應用程序存儲在其自己的進程空間其自己的共享和實例比特。它是無效的,但僅限於服務。

治癒?讓Windows服務在MVC應用程序中調用一個方法來表明它已經改變了事物當然是一種選擇。另一種方法是在值更改時使用不同的方法來使用戶數無效。

+0

感謝您的回答格雷格。你有一切權利,但我沒有留下一件事。服務本身使用反射來創建處理數據層的類的實例。那些處理類(在數據層中)然後調用與Web相同的CreateUser方法。上面的簡短答案是否保持不變? – aherrick 2011-06-09 18:27:58

+0

每個靜態實例在特定的進程空間內只是靜態的。即使這兩個對象都是通過反射在兩個地方實例化,它們仍然生活在一定的空間內。您可以通過包裝功能(例如)的服務來解決這個問題,但這只是將靜態實例遷移到由具有自己的進程空間的兩個應用程序調用的單個進程空間(服務)。 – 2011-06-10 19:40:12

1

我認爲問題在於你在兩個不同的應用程序空間中操作。 Web和服務層每個都有自己的應用程序空間,每個應用程序空間都有自己的靜態屬性。數據層只是一個裝入每個應用程序空間的程序集。只有將這些數據保存到磁盤或內存數據庫時,纔會在每個應用程序空間中看到相同的數據。