2011-01-24 6 views
9

私はPrism 2.1からPrism 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には、コンテナに依存しないという利点があります。これは、基本となるコンテナが実際には問題ではないことを意味します。ここでのServiceLocatorを使用してロガーを解決する例を示します。

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

ServiceLocatorは、ホストプロジェクトがMicrosoft.Practices.ServiceLocation.dllと一致using声明への参照を持っていることが必要です。

+0

このDavidに感謝します。 – JohnC

+7

ありがとうございます、なぜあなたは 'Log4NetLogger'にキャストしていますか?ロギングソリューションが変更された場合、すべてのロガーインスタンスを別のタイプに再度キャストするか、キャストコードを削除する必要があります。 – Jalal

+0

実際、なぜあなたはキャストしますか?これは、Log4NetLoggerを定義するアセンブリへの参照を必要とすることを暗示します。これは、目的を全滅させます... – Kris

関連する問題