2010-10-25 12 views
9

J'ai intégré log4net dans mon application. J'ai quelques méthodes auxiliaires pour aider à la journalisation qui appelle log4net. Lors du refactoring, je prévois de déplacer ces méthodes vers la classe de base afin que le code ne soit pas répété dans d'autres classes dérivées.Log4net - stratégie optimale lors de l'utilisation de l'héritage

Sans le modèle d'héritage, suivant a fonctionné correctement dans chaque classe

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

Placer ci-dessus dans la classe de base retourne le type déclarant que la classe de base et non dérivée classe.

Quelle est la meilleure façon de déplacer cette déclaration vers la classe de base? À l'heure actuelle, je peux penser à quelques façons d'y parvenir, mais ne les trouve pas optimales.

Répondre

10

Je pense que je ferais ceci:

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

Merci Stefan. Aurais-je besoin de rendre "Log" non statique? – byte

+0

Ou dans le constructeur de classe de base écrire quelque chose comme si (BaseClass.Log == null) {BaseClass.Log = LogManager.GetLogger (this.GetType()); } // En supposant que Log est toujours private static dans BaseClass – byte

+0

Il ne peut pas être statique car vous avez besoin d'une instance par classe dérivée. –

3

Sur la base de la réponse de Sefan voici comment je l'ai déclaré dans la classe de 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

Nous venons redéclarez dans chaque classe qui a besoin d'un enregistreur (le point d'être un privé statique) et utilisez un extrait de code pour rendre cela aussi simple que de taper log<tab><tab> si vous voulez obtenir un peu plus de fantaisie, mais vous pouvez faire quelque chose comme:

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

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

Et perforez T à travers votre hiérarchie d'héritage afin qu'il soit la classe la plus dérivée. Le problème avec toutes les réponses ici est que vous perdez des informations sur l'origine des messages de log, donc je resterais personnellement fidèle à votre code d'origine malgré la nouvelle règle.