log4net, Castle Windsor и метод Application_Error в Global.asax - PullRequest
3 голосов
/ 30 декабря 2011

Я следовал учебнику , чтобы настроить log4net с использованием контейнера Windsor.Как и в учебном пособии, я настраиваю класс 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);
}

LoggerInstaller вызывается во время Application_Start (), но не внедряется.Любая помощь будет оценена.Я уверен, что это, вероятно, что-то простое, я пропускаю.

1 Ответ

1 голос
/ 02 января 2012

«Logger» не будет внедрен в «global.asax», потому что этот класс не был создан (это невозможно сделать) через Windsor / IoC Container.

Если вам нужен регистратор в «Application_Error»Я мог бы предложить вам создать свой контейнер в «Application_Start», оставить его закрытым для класса «global.asax» и использовать подход Resolve / Release в методе «Application_Error»

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