2016-08-28 109 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)' –