2016-08-28 74 views
1

是否有可能通过某种方式获取对IServiceProvider的引用,或某种可以解决依赖关系的类的依赖?例如,当使用UseExceptionHandler处理一个异常以向客户端输出有意义的内容时,我还想做一些自定义日志记录来记录关于抛出的异常的一些内容。依赖注入在ASP.net核心中的飞行

例如,可以说我有这样的代码在Configure方法在Startup类我ASP.net核心项目:

app.UseExceptionHandler(
    builder => 
    { 
     builder.Run(
     async context => 
      { 
      context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; 
      context.Response.ContentType = "text/html"; 

      var error = context.Features.Get<IExceptionHandlerFeature>(); 
      if (error != null) 
      { 
       // TODO Log Exception. Would like to do something like this: 
       // var logger = ServiceProvider.Resolve<ILogger>(); 
       // logger.LogCritical("Unhandled Error :"error.Error.ToString()); 
       await context.Response.WriteAsync($"<h1>Error: {error.Error.Message}</h1>").ConfigureAwait(false); 
      } 
      }); 
    }); 

我怎么能当我没有得到ILogger的一个实例一个构造函数传入ILogger?

+0

您使用的是什么DI框架? –

+0

我正在使用内置的asp.net核心DI框架。 – Kento

回答

2

您可以访问builder.ApplicationServices中的ServiceProvider。从那里你可以选择一个ILoggerFactory的实例,然后为你的异常处理程序创建logger

app.UseExceptionHandler(
      builder => 
      { 
       builder.Run(
        async context => 
        { 
         ... 
         var lf = builder.ApplicationServices.GetService<ILoggerFactory>(); 
         var logger = lf.CreateLogger("myExceptionHandlerLogger"); 
         logger.LogDebug("I am a debug message"); 
         ... 
        }); 
      }); 
+2

应该不需要使用'builder.ApplicationServices'。您可以将该方法定义为'Configure(IApplicationBuilder,IHostingEnvironment,ILoggerFactory)' –