[英]Should you use the method Application_Error in your global.asax in ASP.NET MVC?
[英]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.