Использование Ninject для заполнения зависимости Log4Net

Я использую 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.

25
задан Brook 21 July 2011 в 19:20
поделиться