簡體   English   中英

log4net,Castle Windsor和Global.asax中的Application_Error方法

[英]log4net, Castle Windsor, and the Application_Error method in Global.asax

我按照教程使用Windsor容器設置log4net 像教程一樣,我設置了LoggerInstaller類:

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但不注入。 任何幫助,將不勝感激。 我敢肯定這可能是我忽略的一些簡單。

“Logger”不會被注入“global.asax”,因為尚未通過Windsor / IoC Container創建(無法完成)該類。

如果您需要“Application_Error”中的記錄器,我可能會建議您在“Application_Start”中創建容器,將其保密為“global.asax”類,並在“Application_Error”方法中使用Resolve / Release方法

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);
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM