2011-12-30 76 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