2011-05-26 16 views
6

Bir WCF Hizmetinde, her zaman her yerden erişilebilen bir değişken oluşturmanız gerekir. Hizmetimin tüm yöntemlerinin bu verilere erişmesi gerekiyor ve bunu yalnızca bir kez yükleyebilirim. Bu yüzden Global.asax.cs'de statik bir değişken kullanmaktan bahsediyorum. Ancak, bu değişkenin kapsamının ne olacağını anlayamadığımdan emin değilim. Bu veriler tüm talepler için kullanılacak mı? Benim anlayışım, aynı statik değişkenin Uygulama Alanında kullanılmasının gerekmesidir. Bu doğru mu?Global.asax.cs ve Statik değişkeni

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(); 
} 

Son olarak, bunu başarmanın daha iyi bir yolu var mı? bir uygulama olarak küresel o değişken adı aracılığıyla dışında fiili uygulanmasında

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(); 
} 

gerçekten çok farklı Şimdi değil Sunulursa: Ben

+1

Küresel bir değişken istemiyorsunuz, ancak herhangi birinden ve her yerden erişilebilen bir şey istiyorsanız, çelişkiyi görüyor musunuz? – codymanix

cevap

5

Bir uygulama değişkeni kullanabilirsiniz ... statik değişkenin büyük bir hayranı değilim değişken.

+2

Şahsen, alışılmamış Hashtables gibi Uygulamaların daha kötü ve ardından tek bir yazılan nesne olduğunu öğreniyorum. Uygulama verileri en azında uygulama alanıyla paylaşılıyor mu? – codymanix

+0

@codymanix: Yah, bu, tüm AppDomain genelinde evrensel olarak kullanılabilir olan değişkeni yapar. Bu tür bir bilgiyi saklamak için en sevdiğim yöntem değil, ancak uygulama alanıyla ilgili özel bilgileri toplamak, kullanmak için iyi bir ortak mekanizma. Bu görevi gerçekleştirmek için kullandığım yöntem değil, işe yarıyor. –

0

Evet bir statik değişken geçerli/tüm uygulamanız uygulamanızdan görülebilir.

AFAIK, statik değişkenler AppDomains arasında paylaşılmaz. Bu görevi yerine getirebilmek için at this example'a bakabilirsiniz.

global değişkenini istemiyorsunuz, ancak herhangi birinden ve her yerden erişilebilen bir şey istiyorsanız, çelişkiyi görüyor musunuz? Herhangi bir tekil türü sadece global bir değişkendir. Ama senin durumunda en iyi çözüm gibi görünüyor. Global nesnesinin immutable ve dişli güvenli olduğundan emin olmalısınız.

0

"Uygulama geniş" değişkeninizi saklamak için Singleton desenini kullanırdım. Statiktir, ilk kullanımdan sonra tahsis edilir ve uygulamanızın ömrü boyunca kullanılabilir. Ben de bunun bir yazılmamış HashTable Uygulamasını kullanmaktan çok daha iyi olduğunu düşünüyorum. Bana göre Uygulama depolama, ASP'den bir kalıntıdır ve nesne odaklı dünyada artık yararlı değildir.

Her web isteği/hizmet çağrısı kendi iş parçacığı içinde çalıştığı için, statik değişkenin yalnızca bir kez başlatıldığından emin olun. Daha sonra çağrı parçacığı olacağından daha iyi

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; 
     } 
    } 
} 

Olay statik yapıcı bir başlatma olacaktır: Bunun gibi

ilk kullanım verileri yüklemek ve MyData.Data ile her yerden bu erişebilir kasa.