2011-01-24 2 views
9

프리즘 2.1에서 프리즘 4로 변환 중이고 Log4Net 용 ILoggerFacade 클래스를 작성해야합니다. Prism 2.1의 오래된 코드는 더 이상 작동하지 않습니다. 누구든지 공유 할 의사가있는 ILoggerFacade 클래스의 샘플 코드가 있습니까? 당신의 도움을 주셔서 감사합니다.프리즘 4 Log4Net 용 ILoggerFacade?

답변

23

나는 그것을 알아 냈다. Prism 2와 매우 유사합니다. 먼저 ILoggerFacade를 구현하는 사용자 정의 로거 클래스를 만듭니다. 여기 내 클래스의 :

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

다음, 프리즘 4 부트 스트 래퍼 클래스, 사용자 정의 로거 클래스의 새 인스턴스를 반환 CreateLogger() 방법에 재정의를 추가

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

주를 그 정의에 logger 클래스 인 ILog은 Log4Net 인터페이스이고 LogManager은 Log4Net 객체입니다.

사용자 코드에서 사용자 지정 로거에 쓰기 (Prism은 자체 로그 항목을 처리 함)는 Prism 2.1과 약간 다릅니다. IoC 컨테이너에서 직접 로거를 해결하거나 ServiceLocator를 사용할 수 있습니다. ServiceLocator에는 컨테이너에 독립적 인 이점이 있습니다. 즉, 기본 컨테이너가 실제로 중요하지 않음을 의미합니다.

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

ServiceLocator 호스트 프로젝트 Microsoft.Practices.ServiceLocation.dll 참조 및 매칭 using 문 있어야 : 여기 ServiceLocator 로거를 사용하여 해결하는 예이다.

+0

감사합니다. – JohnC

+7

고맙지 만, 왜 그것을 'Log4NetLogger'로 전송 했습니까? 로깅 솔루션이 변경되면 모든 로거 인스턴스를 다른 유형으로 다시 캐스팅하거나 캐스트 코드를 제거해야합니다. – Jalal

+0

실제로 왜 캐스팅하셨습니까? 그것은 당신이 Log4NetLogger를 정의하는 어셈블리에 대한 참조를 필요로 함을 암시합니다. – Kris