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