我正在尝试将Log4net与Autofac一起使用。
我已粘贴此代码http://autofac.readthedocs.org/en/latest/examples/log4net.html
并从Program.cs/Main()

var iocBuilder = new ContainerBuilder();
iocBuilder.RegisterModule(new LoggingModule());
var iocContainer = iocBuilder.Build();

现在,我想立即尝试这一点(在下一行中),
在日志文件中写一条简单的线。我该怎么办?

我在想这样的事情
var ls = iocContainer.Resolve<LoggingModule>();
ls.Info("the logging is working");

非常感谢

最佳答案

为了获得ILog,log4net需要知道使用记录器的类(LogManager.GetLogger(...))。因此,如果没有父类,则无法解析ILog。您必须将ILog注入(inject)组件内部。

public class MyComponent
{
     public MyComponent(ILog logger)
     {
          this._logger = logger;
     }

     private readonly ILog _logger;

     public void Do()
     {
          this._logger.Info("Log4net OK");
     }
}

在应用程序启动中(对于Asp.net,MVC,为Global.asax.cs):
// ...
log4net.Config.XmlConfigurator.Configure();
// ...
iocBuilder.RegisterModule(new LoggingModule());
iocBuilder.RegisterType<MyComponent>().AsSelf();

// ...

MyComponent c = iocContainer.Resolve<MyComponent>();
c.Do();

另一种解决方案是为ILog注册一个Object并解析ILog。在这种情况下,不需要模块。

//在DI容器构建器中:
log4net.Config.XmlConfigurator.Configure();
/// ...
ContainerBuilder cb = new ContainerBuilder()
cb.Register(c => LogManager.GetLogger(typeof(Object))).As<ILog>();
IContainer container = cb.Build();

//在需要使用记录器的函数中:
ILog logger = container.Resolve<ILog>();
logger.Info("log4net OK");

09-25 17:15