2011-12-30 72 views
3

我使用Windsor容器关注tutorial to setup log4net。像本教程中,我设置了LoggerInstaller类:log4net,Castle Windsor和Global.asax中的Application_Error方法

public class LoggerInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.AddFacility<LoggingFacility>(
      f => f.LogUsing(LoggerImplementation.Log4net) 
        .WithConfig("log4net.config")); 
    } 
} 

在Global.asax,我有以下几种方法:

private static void BootStrapContainer() 
{ 
    container = new WindsorContainer() 
     .Install(FromAssembly.This()); 
    var controllerFactory = new WindsorControllerFactory(container.Kernel); 
    ControllerBuilder.Current.SetControllerFactory(controllerFactory); 
} 

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    RegisterRoutes(RouteTable.Routes); 

    BootStrapContainer(); 
} 

而且ILogger类型被注入:

public ILogger Logger { get; set; } 

这工作正常具有ILogger属性的控制器,但我似乎无法让它注入Global.asax。我想要做的,就是记录未处理在Application_Error事件例外,像这样:

void Application_Error(Object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError().GetBaseException(); 

    Logger.Error("App_Error", ex); 
} 

的Application_Start中被调用时的LoggerInstaller(),但没有注射。任何帮助,将不胜感激。我敢肯定这可能是我忽略的一些简单的事情。

回答

1

“记录器”不会被注入到“global.asax”中,因为该类尚未通过Windsor/IoC容器创建(不能完成)。

如果需要内记录“的Application_Error”我可能会建议你“的Application_Start”中创建您的容器,把它变成私人范围内“的Application_Error”“Global.asax的”类,并使用解析/释放方式方法

void Application_Error(Object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError().GetBaseException(); 

    var logger = _container.Resolve<ILogger>(); 
    logger.Error("App_Error", ex);  
    _container.Release(logger); 
} 
+0

这似乎是一个很好的方法,但是当赋值时:'var logger = _container.Resolve ();'记录器实例似乎没有正确配置,并且没有按照我的log4net.config设置进行登录。我在Application_Start()期间创建容器...任何想法? – dolphy 2012-01-03 19:21:07

+0

你能够成功运行我的代码片段吗? ILogger是否成功解决?你是否在应用程序根目录下有log4net.config?您是否验证了log4net.config设置? – Crixo 2012-01-04 08:12:34

+0

您的代码编译并运行正常,但ILogger(来自castle命名空间,而不是log4net本机类型)似乎没有配置正确。 log4net.config位于根目录,在控制器方法中使用时可以正常工作。没有很多时间来解决问题。 – dolphy 2012-01-05 00:31:22