Я использую Ninject в качестве контейнера DI в своем приложении. Чтобы свободно связываться с моей библиотекой журналирования, я использую такой интерфейс:
public interface ILogger
{
void Debug(string message);
void Debug(string message, Exception exception);
void Debug(Exception exception);
void Info(string message);
...you get the idea
И моя реализация выглядит так
public class Log4NetLogger : ILogger
{
private ILog _log;
public Log4NetLogger(ILog log)
{
_log = log;
}
public void Debug(string message)
{
_log.Debug(message);
}
... etc etc
Пример класса с зависимостью журналирования
public partial class HomeController
{
private ILogger _logger;
public HomeController(ILogger logger)
{
_logger = logger;
}
При создании экземпляра Log4Net вы должны указать его имя класса, для которого будет вестись запись. Это оказывается проблемой с Ninject.
Цель состоит в том, чтобы при создании экземпляра HomeController Ninject создавал экземпляр ILog с «именем» «HomeController»
Вот что у меня для config
public class LoggingModule : NinjectModule
{
public override void Load()
{
Bind<ILog>().ToMethod(x => LogManager.GetLogger(GetParentTypeName(x)))
.InSingletonScope();
Bind<ILogger>().To<Log4NetLogger>()
.InSingletonScope();
}
private string GetParentTypeName(IContext context)
{
return context.Request.ParentContext.Request.ParentContext.Request.Service.FullName;
}
}
Однако " Имя ", которое передается в ILog, не соответствует моим ожиданиям. Я тоже не могу понять ни рифмы, ни причины, иногда это правильно, а в большинстве случаев - нет. Имена, которые я вижу, - это имена ДРУГИХ классов, которые также зависят от ILogger.