2010-10-25 10 views
9

Ich habe log4net in meiner App integriert. Ich habe ein paar Hilfsmethoden zur Unterstützung bei der Protokollierung, die log4net aufrufen. Beim Refactoring plane ich, diese Methoden in die Basisklasse zu verschieben, damit der Code in anderen abgeleiteten Klassen nicht wiederholt wird.Log4net - optimale Strategie bei der Vererbung

Ohne das Vererbungsmodell, nach korrekt in jeder Klasse gearbeitet

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

die oben in der Basisklasse Platzierung wird die Deklaration Typ als Basisklasse und nicht abgeleitete Klasse zurück.

Wie kann diese Deklaration optimal in die Basisklasse verschoben werden?

Momentan kann ich mir ein paar Wege vorstellen, um das zu erreichen, finde sie aber nicht optimal.

Antwort

10

Ich glaube, ich würde dies tun:

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

Danke Stefan. Also müsste ich "Log" nicht statisch machen? – byte

+0

Oder schreiben Sie im Basisklassenkonstruktor etwas wie if (BaseClass.Log == null) {BaseClass.Log = LogManager.GetLogger (this.GetType()); } // Angenommen, Log ist immer noch private static in BaseClass – byte

+0

Es kann nicht statisch sein, weil Sie eine Instanz pro abgeleiteter Klasse benötigen. –

3

Basierend auf Sefan Antwort hier ist, wie ich es in der Klasse Base erklärt

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

Wir es nur in jeder Klasse neu deklarieren, die einen Logger muss (Der Punkt davon ist eine private statische) und verwenden Sie ein Code-Snippet, um das so einfach wie die Eingabe log<tab><tab>, wenn Sie extravagante erhalten wollten, obwohl Sie etwas tun könnten wie:

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

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

Und punch T durch Ihre Vererbungshierarchie, so dass es die abgeleitete Klasse ist. Das Problem mit all den Antworten hier ist, dass Sie Informationen darüber verlieren, woher Protokollnachrichten kommen, so würde ich persönlich trotz des zusätzlichen Textbausteins an Ihrem ursprünglichen Code bleiben.

Verwandte Themen