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