Prism 4 ILoggerFacade для Log4Net? - PullRequest
10 голосов
/ 24 января 2011

Я перехожу из Prism 2.1 в Prism 4, и мне нужно написать класс ILoggerFacade для Log4Net.Мой старый код из Prism 2.1 больше не работает.У кого-нибудь есть пример кода для класса ILoggerFacade, которым он хотел бы поделиться?Спасибо за вашу помощь.

1 Ответ

24 голосов
/ 24 января 2011

Я понял это.Очень похоже на 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 добавьте переопределение в метод 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.

...