2011-01-24 13 views
9

Konwertuję z Prism 2.1 na Prism 4, i muszę napisać klasę ILoggerFacade dla Log4Net. Mój stary kod z Prism 2.1 już nie działa. Czy ktoś ma przykładowy kod dla klasy ILoggerFacade, którą chciałby udostępnić? Dzięki za pomoc.Prism 4 ILoggerFacade dla Log4Net?

Odpowiedz

23

Wymyśliłem to. Bardzo podobne do Prism 2. Najpierw utwórz niestandardową klasę rejestratora, która implementuje ILoggerFacade. Oto moja klasa:

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

Następnie w klasie Prism 4 inicjującego, dodać nadpisanie metody CreateLogger() że zwraca nową instancję klasy niestandardowej Rejestrator:

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

pamiętać, że w zwyczaju logger class, ILog to interfejs Log4Net, a LogManager to obiekt Log4Net.

Zapisywanie do niestandardowego programu rejestrującego z własnego kodu (Prism zajmuje się własnymi zapisami w dzienniku) jest nieco inne niż w Prism 2.1. Możesz rozwiązać rejestrator bezpośrednio z kontenera IoC lub możesz skorzystać z ServiceLocator. Atrybut ServiceLocator ma tę zaletę, że nie nadaje się do kontenera, co oznacza, że ​​podstawowy pojemnik nie ma znaczenia. Oto przykład rozwiązywania rejestratora za pomocą ServiceLocator:

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

ServiceLocator wymaga, aby projekt gospodarz mieć odniesienie do Microsoft.Practices.ServiceLocation.dll i dopasowanie using oświadczenie.

+0

Dzięki za to Davidzie. – JohnC

+7

Dziękuję, ale dlaczego rzuciłeś to na "Log4NetLogger"? jeśli rozwiązanie rejestrowania zostanie zmienione, wszystkie instancje rejestratora muszą zostać ponownie przesłane do innego typu lub usunąć kod odrzucenia! – Jalal

+0

Rzeczywiście, dlaczego miałbyś rzucić? Sugerowałoby to, że będziesz potrzebował odniesienia do zestawu, który definiuje Log4NetLogger, który pokonuje cały cel ... – Kris