Konwertuję z Prism 2.1 na Prism 4, i muszę napisać klasę ILoggerFacade dla Log4Net. Mój stary kod z Prism 2.1 już nie działa. Czy ktoś ma przykładowy kod dla klasy ILoggerFacade, którą chciałby udostępnić? Dzięki za pomoc.Prism 4 ILoggerFacade dla Log4Net?
Odpowiedz
Wymyśliłem to. Bardzo podobne do Prism 2. Najpierw utwórz niestandardową klasę rejestratora, która implementuje ILoggerFacade. Oto moja klasa:
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
}
}
Następnie w klasie Prism 4 inicjującego, dodać nadpisanie metody CreateLogger()
że zwraca nową instancję klasy niestandardowej Rejestrator:
protected override Microsoft.Practices.Prism.Logging.ILoggerFacade CreateLogger()
{
return new Log4NetLogger();
}
pamiętać, że w zwyczaju logger class, ILog
to interfejs Log4Net, a LogManager
to obiekt Log4Net.
Zapisywanie do niestandardowego programu rejestrującego z własnego kodu (Prism zajmuje się własnymi zapisami w dzienniku) jest nieco inne niż w Prism 2.1. Możesz rozwiązać rejestrator bezpośrednio z kontenera IoC lub możesz skorzystać z ServiceLocator. Atrybut ServiceLocator
ma tę zaletę, że nie nadaje się do kontenera, co oznacza, że podstawowy pojemnik nie ma znaczenia. Oto przykład rozwiązywania rejestratora za pomocą ServiceLocator:
var logger = (Log4NetLogger)ServiceLocator.Current.GetInstance(typeof(ILoggerFacade));
logger.Log("App.OnStartup() completed", Category.Info ,Priority.None);
ServiceLocator
wymaga, aby projekt gospodarz mieć odniesienie do Microsoft.Practices.ServiceLocation.dll i dopasowanie using
oświadczenie.
Dzięki za to Davidzie. – JohnC
Dziękuję, ale dlaczego rzuciłeś to na "Log4NetLogger"? jeśli rozwiązanie rejestrowania zostanie zmienione, wszystkie instancje rejestratora muszą zostać ponownie przesłane do innego typu lub usunąć kod odrzucenia! – Jalal
Rzeczywiście, dlaczego miałbyś rzucić? Sugerowałoby to, że będziesz potrzebował odniesienia do zestawu, który definiuje Log4NetLogger, który pokonuje cały cel ... – Kris