11

Prism2.1からPrism4に変換していますが、Log4Net用のILoggerFacadeクラスを作成する必要があります。Prism2.1の古いコードは機能しなくなりました。誰かが喜んで共有したいILoggerFacadeクラスのサンプルコードを持っていますか?ご協力いただきありがとうございます。

4

1 に答える 1

25

私はそれを考え出した。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
    }
}

次に、Prism 4 Bootstrapper クラスCreateLogger()で、カスタム ロガー クラスの新しいインスタンスを返すメソッドにオーバーライドを追加します。

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

カスタム ロガー クラスで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ステートメントが必要です。

于 2011-01-24T20:28:53.167 に答える