2010-10-25 26 views
9

Uygulamamda log4net'i entegre ettim. Log4net çağrısı yapan günlüğe kaydetmede yardımcı olacak birkaç yardımcı yöntemim var. Refactoring yaparken, bu yöntemleri diğer türetilmiş sınıflarda kod tekrarlanmaması için taban sınıfına taşımayı planlıyorum. kalıtım modeli olmadan Log4net - miras kullanırken optimum strateji

, temel sınıf olarak ilan tipi döner taban sınıfı yukarıda yerleştirilmesi her sınıf

private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

düzgün çalışan ve türetilmiş sınıf olmayan aşağıdaki.

Bu bildirimi temel sınıfa taşımanın en iyi yolu nedir? Şu anda bunu başarmak için birkaç yol düşünebilirim, ancak bunları en uygun şekilde bulamıyorum.

cevap

10

Bunu yapacağını düşünüyorum: Ben temel sınıf

/// <summary> 
    /// This is delay loaded to allow us to capture the class type of the inherited class on request 
    /// </summary> 
    private ILog log = null; 

    protected ILog Log 
    { 
     get 
     { 
      if (log == null) 
      { 
       log = LogManager.GetLogger(this.GetType()); 
      } 

      return log; 
     } 
    } 
+0

Teşekkürler Stefan. Yani "Log" statik olmayan yapmak zorunda mıyım? – byte

+0

Veya temel sınıf yapıcısında bir şey yazın (BaseClass.Log == null) {BaseClass.Log = LogManager.GetLogger (this.GetType()); } // Log ın hala BaseClass içinde özel statik olduğunu varsayarak – byte

+0

Türetilmiş sınıf başına bir örneğe gereksiniminiz olduğundan statik olamaz. –

3

burada (

: Eğer böyle bir şey yapabileceğini olsa fazladan fantezi olsun istedim eğer statik bir özel olma noktası) ve log<tab><tab> yazarak kadar bu kadar basit hale getirmek için bir kod parçası kullanın
public class Loggable<T> where T : Loggable<T> 
{ 
    private static readonly ILog log = LogManager.GetLogger(typeof(T)); 

    protected static ILog Log 
    { 
     get 
     { 
      return log; 
     } 
    } 
} 

Ve en çok türetilmiş sınıf olacak şekilde devralma hiyerarşiniz boyunca T'yi yumruklayın. Buradaki tüm cevaplarda sorun, günlük mesajlarının nereden geldiği hakkında bilgi kaybetmemenizdir, bu yüzden eklenmiş olan boilerfora rağmen orijinal kodunuza şahsen yapışabilirim.

0

Sadece bir logger gereken her sınıfta bunu redeclare bunu deklare nasıl Sefan cevabı dayanarak

LogManager.GetLogger(this.GetType());