Примечание: Обновлено с предлагаемыми улучшениями, ближе, но все еще не совсем там!Инъекция NLog с регистром AutofacGeneric
Как и к этому вопросу - Passing in the type of the declaring class for NLog using Autofac - Я пытаюсь ввести экземпляры NLog в свои классы репозитория.
Интерфейс:
public interface ILogger<T>
where T: class
{
...
}
Реализация:
public class NLogger<T> : ILogger<T>
where T: class
{
private readonly Logger _logger;
public NLogger()
{
_logger = LogManager.GetLogger(typeof(T).FullName);
}
public void Debug(string message)
{
_logger.Debug(message);
}
...
}
Зарегистрировано Autofac как:
builder.RegisterGeneric(typeof (NLogger<>)).As(typeof (ILogger<>));
Используя контрольные точки, я вижу, что Autofac создает кучу ILogger/NLogger с правильные типы для всех моих различных репозиториев, но результирующие журналы появляются с ca llsite является «NLog.LoggerImpl.Write».
Спасибо за помощь!
Рабочий раствор с обобщениями:
public class NLogger<T> : ILogger<T>
where T: class
{
private readonly Logger _logger;
public NLogger()
{
_logger = LogManager.GetLogger(typeof(T).FullName);
}
public void Debug(string message)
{
_logger.Log(typeof(T), new LogEventInfo(LogLevel.Debug, _logger.Name, message));
}
Высоко связанный с этим вопрос: http://stackoverflow.com/questions/7412156/how-to-retain-callsite-information-when-wrapping-nlog – nemesv
Прочитайте это, но я не пытаюсь передать имя класса в качестве конструктора, пытаясь сделать это с помощью дженериков. Подобно 3-летнему ответу от bentayloruk на http://stackoverflow.com/questions/6623431 – Jeremy
Вам все равно нужно сделать то, что описано в связанном вопросе: поэтому вам нужно изменить свой метод отладки на: 'public void Debug (строковое сообщение) { _logger.Log (typeof (NLogger), новый LogEventInfo (LogLevel.Debug, _logger.Name, message)); } ', чтобы заставить' $ {callsite} 'работать правильно. –
nemesv