2010-10-25 11 views
9

He integrado log4net en mi aplicación. Tengo algunos métodos de ayuda para ayudar en el registro que llaman a log4net. Al refactorizar, planeo mover estos métodos a la clase base para que el código no se repita en otras clases derivadas.Log4net: estrategia óptima al usar la herencia

Sin el modelo de herencia, siguiendo funcionado correctamente en cada clase

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

Colocación de la anterior en la clase base devolverá el tipo que se declara como clase base y no derivadas clase.

¿Cuál es una forma óptima de trasladar esta declaración a la clase base?

Actualmente, puedo pensar en algunas formas de lograr esto pero no las encuentro óptimas.

Respuesta

10

creo que me gustaría hacer esto:

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

Gracias Stefan. Entonces, ¿necesitaría hacer que "Log" no sea estático? – byte

+0

O en el constructor de la clase base escriba algo como if (BaseClass.Log == null) {BaseClass.Log = LogManager.GetLogger (this.GetType()); } // suponiendo que el registro sigue siendo privado estático en BaseClass – byte

+0

No puede ser estático porque necesita una instancia por clase derivada. –

3

Sobre la base de la respuesta de Sefan así es como lo declaré en la clase base

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

Acabamos redeclare en cada clase que necesita un registrador (el punto de que sea un privado estático) y use un fragmento de código para que sea tan simple como escribir log<tab><tab> si desea obtener una mayor fantasía aunque podría hacer algo como:

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

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

Y perfora T a través de tu jerarquía de herencia para que sea la clase más derivada. El problema con todas las respuestas aquí es que pierde información acerca de dónde provienen los mensajes de registro, por lo que yo personalmente me apegaré a su código original a pesar de la repetición adicional.

Cuestiones relacionadas