在global.asax中注册并使用带有Unity的记录器

时间:2011-05-20 11:46:26

标签: asp.net unity-container

我正在使用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 个答案:

答案 0 :(得分:4)

您实际上希望在使用它的每个方法中从DependencyResolver重新解析它。如果您使用应用程序作用域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);
    }
}

答案 1 :(得分:-1)

另一种方法是使记录器保持静态:

private static ILogger _logger;

当然,您的记录器实现必须是线程安全的。