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

Mat*_*ear 8 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");
    }
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常 - 消息被记录.稍后在global.asax.cs中我有这个:

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

    protected void Application_Error()
    {
        Exception lastException = Server.GetLastError();
        _logger.Fatal(lastException);
    }
Run Code Online (Sandbox Code Playgroud)

但是,这会引发异常 - _logger为null.我怀疑我在使用Unity做错了什么 - 那么在global.asax中使用记录器的正确方法是什么?

Eth*_*iac 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);
    }
}
Run Code Online (Sandbox Code Playgroud)