2009-08-25 30 views
10

C# içinde bir WCF hizmeti yazıyorum. Başlangıçta benim uygulamam, bir kerelik başlatmayı yapmak için statik bir kurucuya sahipti, ancak yapılmakta olan bazı başlatmalar (geçici olarak) başarısız olabilir.Tür başlatıcı (statik yapıcı) özel durum işleme

İlk (başarısız) deneme bir istisna atmış olsa bile, statik kurucuların yalnızca bir kez çağrıldığı anlaşılıyor mu? Sınıfımı başlatmaya yönelik sonraki girişimler, gerçekte kod yürütülmeden bir TypeInitializationException ile hemen başarısız olacaktır.

C# dil belirtimi, statik bir kurucunun en çok bir kez çağrıldığını belirtir, ancak temel olarak bu, yakalanmasanız bile, kurtarılamayacağınız bir hatada bir istisna yapar.

Burada bir şey mi özlüyorum? Hizmetin örnek yapıcısına uzaktan tehlikeli herhangi bir şey taşımalı ve sınıf başlatma işleminin önceden başarıyla tamamlanıp tamamlanmadığını manuel olarak kontrol etmeliyim.

cevap

3

Bu nedenle, kritik bölümleri try/catch içinde sarmayı başarabilir ve en azından, bu, türün başlatılamadığı anlamına gelir, ancak başlatma kodu kritikse, kesinlikle bu davranış aslında iyi - tip değil Bu başlatılmamış durumda kullanılabilir.

Diğer seçenek, bunu bir singleton olarak yapmaktır - her defasında, doğru bir şekilde, ilk kez başarısız olsa bile, başarılı olana kadar, örneği doğru bir şekilde oluşturabileceğiniz anı elde edersiniz.

Örnekte sizi ilk (veya ikinci vb.) Zamanını döndürmesi durumunda arayanda hata işlemeye devam etmeniz gerekebilir.

Düzenleme: Ve a tek istemiyorsanız, o zaman sadece örnek yapıcı statik parça başlatmak zorunda

örn

private object _lock = new object() 
private bool _initialized; 

public T() 
{ 
    lock(_lock) 
    { 
     if(!_initialized) 
     { 
     try 
     { 
      //Do static stuff here 
     } 
     catch(Exception ex_) 
     { 
      //Handle exception 
     } 
     } 
    } 
} 
+1

Aslında şu an sahip olduğum şey şu ki, çift kontrol edilen kilitleme kullanıyorum ve '_initialized' bool 'volatile' (çift ​​kilitlemesiz kilitleme gereklidir) – Thorarin

3

Buradaki ders oldukça basittir: Statik bir kurucuda mantıklı bir şekilde başarısız olabilecek hiçbir şey yapmayın.

+0

MSDN, türün başlatılmamış olarak kalmaya devam ettiğini, ancak bunu bir örnek oluşturmanın imkansız olduğu anlamına gelmek için hemen almadığını belirtiyor. Bu konuda daha açık bir uyarı beklerdim. Çalışmak için büyük bir anlaşma değil, ama statik kurucuları çok daha az yararlı hale getirir :( – Thorarin

+0

@Thorarin - sadece AppDomain'in ömrü boyunca. 'Türü, programınızın çalıştığı uygulama etki alanının ömrü boyunca başlatılmamış olarak kalır MSDN http://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx – VoodooChild

0

Geçmişte kullandığım geçici çözüm, bir Singleton oluşturuyor. Statik bir kurucu başarısız olur ve sadece başarısızlık tüm uygulamanın çalışamadığı anlamına gelirse başarısız olur.