2010-10-25 5 views
9

Mam zintegrowaną aplikację log4net w mojej aplikacji. Mam kilka metod pomocnika, aby pomóc w logowaniu się, które wywołanie log4net. Podczas refaktoryzacji planuję przenieść te metody do klasy bazowej, aby kod nie był powtarzany w innych klasach pochodnych.Log4net - optymalna strategia w przypadku dziedziczenia

bez modelu spadków następujące pracował prawidłowo w każdej klasie

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

Umieszczenie powyższe klasy bazowej powróci Zgłaszająca typu co bazową, nie pochodzące klasy.

Jaki jest optymalny sposób przeniesienia tej deklaracji do klasy bazowej?

Obecnie mogę wymyślić kilka sposobów osiągnięcia tego celu, ale nie uważam ich za optymalne.

Odpowiedz

10

myślę, że będzie to zrobić:

LogManager.GetLogger(this.GetType()); 
+0

Dzięki Stefan. Czy muszę więc uczynić "Log" nie statycznym? – byte

+0

Lub w konstruktorze klasy podstawowej napisz coś jak if (BaseClass.Log == null) {BaseClass.Log = LogManager.GetLogger (this.GetType()); } // przy założeniu, że Log jest nadal statyczny w klasie prywatnej w BaseClass – byte

+0

Nie może być statyczny, ponieważ potrzebujesz jednej instancji na klasę pochodną. –

3

podstawie odpowiedzi Sefan za oto jak mi oświadczył, że w klasie bazowej

/// <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

Właśnie redeclare go w każdej klasie, która potrzebuje rejestratora (chodzi o to, aby być statusem prywatnej) i użyć fragmentu kodu, aby było to tak proste jak wpisanie log<tab><tab>, jeśli chcesz uzyskać dodatkową ozdobę, chociaż możesz zrobić coś takiego:

public class Loggable<T> where T : Loggable<T> 
{ 
    private static readonly ILog log = LogManager.GetLogger(typeof(T)); 

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

I przebij T przez hierarchię dziedziczenia tak, aby była najbardziej pochodną klasą. Problem ze wszystkimi odpowiedziami tutaj polega na tym, że tracisz informacje o tym, skąd pochodzą wiadomości dziennika, więc osobiście trzymałbym się oryginalnego kodu mimo dodanego zestawu znaków.

Powiązane problemy