11

我正在从 Prism 2.1 转换为 Prism 4,我需要为 Log4Net 编写一个 ILoggerFacade 类。我来自 Prism 2.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 回答