2011-05-26 197 views
6

在一個WCF服務中,我需要創建一個應該隨時隨地訪問的變量。我的服務的所有方法都需要訪問該數據,我只能加載一次。所以我想在Global.asax.cs中使用一個靜態變量。但是我不確定要理解變量的範圍。這些數據是否會用於所有請求?我的理解是,它應該是因爲應用程序域中應該使用相同的靜態變量。那是對的嗎?Global.asax.cs和靜態變量

public static IList<MyData> Data { get; set; } 
private static IList<MyData> Load() 
{ 
    return Big data struct from DB. 
} 

protected void Application_Start(object sender, EventArgs e) 
{ 
    Data = Load(); 
} 

最後,有沒有更好的方法來實現呢?我不是靜態變量的大風扇......

+1

你不想要一個全局變量,但你想要一個可以從任何人和任何地方訪問的東西,看到矛盾? – codymanix 2011-05-26 17:11:49

回答

5

你可以使用一個應用程序變量:

public static IList<MyData> Data { 
    get 
    { 
     if (Application["MyIListData"] != null) 
      return (IList<MyData>)Application["MyIListData"]; 
     else 
      return new IList<MyData>(); 
    } 
    set 
    { 
     Application["MyIListData"] = value;  
    } 
} 

protected void Application_Start(object sender, EventArgs e) 
{ 
    Data = Load(); 
} 

不是真的,只是實際執行很大的不同,現在它是全球範圍內提供通過該變量的名稱爲應用程序變量。

+2

就個人而言,我發現像應用程序這樣的全局無類型的哈希表比一個單一類型的對象更糟。至少應用程序數據是否跨應用程序域共享? – codymanix 2011-05-26 17:14:21

+0

@codymanix:是的,這使變量在整個AppDomain中通用。這不是我最喜歡的存儲此類信息的方法,但對於聚合應用程序專用信息,這是一種很好的常用機制。這不是我用來完成這項任務的方法,但它確實有效。 – 2011-05-26 17:25:32

0

是的,您的應用程序中的所有線程/會話都是有效/可見的靜態變量。

AFAIK,靜態變量不在之間共享應用程序域。爲了完成這個任務,你可以看看at this example

你不希望全球變量,但你想要的東西,可以從任何人和任何地方訪問,你看到矛盾?任何一種單身人士只是一個全局變量。 但在你的情況下,它似乎是最好的解決方案。你應該確保你的全局對象是不可變的線程安全

0

我會使用Singleton模式來存儲您的「應用程序範圍」變量。它是靜態的,將在第一次使用後分配,並在應用程序的整個生命週期中可用。我也認爲這比使用類似於Application的無類型HashTable好得多。對我來說,應用程序存儲是ASP的遺留問題,不再適用於面向對象的世界。

請注意,靜態變量只能初始化一次,因爲每個Web請求/服務調用都在其自己的線程中運行。

這樣你就可以加載在第一次使用的數據和MyData.Data來自世界各地的訪問:

public class MyData 
{ 
    private static IList<MyData> _data { get; set; } 

    public static IList<MyData> Data 
    {  
     get 
     { 
      if (_data == null) 
       _data = load Big data struct from DB. 
      return _data; 
     } 
    } 
} 

事件更是在靜態構造函數的初始化,因爲這樣的調用是thread-安全。