Зарегистрируйтесь и используйте регистратор с Unity в global.asax - PullRequest
8 голосов
/ 20 мая 2011

Я использую Unity, и я регистрирую регистратор, как это:

public class MvcApplication : System.Web.HttpApplication
{
    private ILogger _logger;

    protected void Application_Start()
    {
        ...
        var container = new UnityContainer();
        container.RegisterType<ILogger, NLogLogger>();

        container.RegisterControllers();

        DependencyResolver.SetResolver(new UnityDependencyResolver(container));

        _logger = container.Resolve<ILogger>();
        _logger.Info("Application started");
    }

Это, кажется, работает нормально - сообщение записано. Позже в global.asax.cs у меня есть это:

    protected void Application_End()
    {
        _logger.Info("App is shutting down");
    }

    protected void Application_Error()
    {
        Exception lastException = Server.GetLastError();
        _logger.Fatal(lastException);
    }

Однако это вызывает исключение - _logger имеет значение null. Я подозреваю, что я делаю что-то не так с Unity - так как правильно использовать регистратор внутри global.asax?

Ответы [ 2 ]

4 голосов
/ 21 мая 2011

На самом деле вы захотите повторно разрешить его из DependencyResolver в каждом методе, где вы его используете. Если вы используете Application scoped LifetimeManager, то не должно быть никакого значительного снижения производительности от конструктора. Если вы не используете приложение с областью действия LiftimeManager, то, по крайней мере, вы не получите NullReferenceException!

protected void Application_End()
{
    var logger = DependencyResolver.Current.GetService<ILogger>();
    if(logger != null)
    {
        logger.Info("App is shutting down");
    }
}

protected void Application_Error()
{
    Exception lastException = Server.GetLastError();
    var logger = DependencyResolver.Current.GetService<ILogger>();
    if(logger != null)
    {
        logger.Fatal(lastException);
    }
}
0 голосов
/ 15 июля 2014

Другой способ - сделать регистратор статичным:

private static ILogger _logger;

Конечно, ваша реализация регистратора должна быть поточно-ориентированной.

...