2011-01-24 12 views
9

Sto convertendo da Prism 2.1 a Prism 4 e ho bisogno di scrivere una classe ILoggerFacade per Log4Net. Il mio vecchio codice da Prism 2.1 non funziona più. Qualcuno ha codice di esempio per una lezione di ILoggerFacade che sarebbe disposto a condividere? Grazie per l'aiuto.Prism 4 ILoggerFacade per Log4Net?

risposta

23

L'ho capito. Molto simile a Prism 2. In primo luogo, creare una classe di logger personalizzata che implementa ILoggerFacade. Ecco la mia classe:

using log4net; 
using Microsoft.Practices.Prism.Logging; 

namespace FsNoteMaster3 
{ 
    class Log4NetLogger : ILoggerFacade 
    { 
     #region Fields 

     // Member variables 
     private readonly ILog m_Logger = LogManager.GetLogger(typeof(Log4NetLogger)); 

     #endregion 

     #region ILoggerFacade Members 

     /// <summary> 
     /// Writes a log message. 
     /// </summary> 
     /// <param name="message">The message to write.</param> 
     /// <param name="category">The message category.</param> 
     /// <param name="priority">Not used by Log4Net; pass Priority.None.</param> 
     public void Log(string message, Category category, Priority priority) 
     { 
      switch (category) 
      { 
       case Category.Debug: 
        m_Logger.Debug(message); 
        break; 
       case Category.Warn: 
        m_Logger.Warn(message); 
        break; 
       case Category.Exception: 
        m_Logger.Error(message); 
        break; 
       case Category.Info: 
        m_Logger.Info(message); 
        break; 
      } 
     } 

     #endregion 
    } 
} 

Poi, nella classe prisma 4 di avvio automatico, aggiungere un override del metodo CreateLogger() che restituisce una nuova istanza della classe logger personalizzato:

protected override Microsoft.Practices.Prism.Logging.ILoggerFacade CreateLogger() 
{ 
    return new Log4NetLogger(); 
} 

Si noti che nel costume classe logger, ILog è un'interfaccia Log4Net e LogManager è un oggetto Log4Net.

Scrivere sul registratore personalizzato dal proprio codice (Prism si prende cura delle proprie voci di registro) è leggermente diverso rispetto a Prism 2.1. È possibile risolvere il logger direttamente dal contenitore IoC oppure utilizzare ServiceLocator. Lo ServiceLocator ha il vantaggio di essere indipendente dal contenitore, il che significa che il contenitore sottostante non ha molta importanza. Ecco un esempio di risolvere un registratore utilizzando il ServiceLocator:

var logger = (Log4NetLogger)ServiceLocator.Current.GetInstance(typeof(ILoggerFacade)); 
logger.Log("App.OnStartup() completed", Category.Info ,Priority.None); 

Il ServiceLocator richiede che il progetto di accoglienza hanno un riferimento a Microsoft.Practices.ServiceLocation.dll e un corrispondente using dichiarazione.

+0

Grazie per questo David. – JohnC

+7

Grazie, ma perché lo hai lanciato su 'Log4NetLogger'? se la soluzione di registrazione viene modificata, tutte le istanze del logger devono essere nuovamente convertite in un altro tipo o rimuovere il codice di cast! – Jalal

+0

Infatti, perché dovresti lanciare? Ciò implicherebbe che sarebbe necessario un riferimento all'assembly che definisce Log4NetLogger, che sconfigge l'intero scopo ... – Kris