加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 在global.asax中注册并使用Unity的记录器

发布时间:2020-12-16 03:47:32 所属栏目:asp.Net 来源:网络整理
导读:我正在使用Unity,我注册了一个这样的记录器: public class MvcApplication : System.Web.HttpApplication{ private ILogger _logger; protected void Application_Start() { ... var container = new UnityContainer(); container.RegisterTypeILogger,NLog
我正在使用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中使用记录器的正确方法是什么?

解决方法

您实际上希望在使用它的每个方法中从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);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读