2016-08-28 4 views
1

Возможно ли получить зависимость на лету, как-то получить ссылку на IServiceProvider или какой-либо класс, который может разрешать зависимости? Например, при обработке исключения с UseExceptionHandler для вывода чего-либо значимого для клиента, я также хотел бы сделать некоторые пользовательские протоколирования, чтобы отметить некоторые сведения об исключении, которое было выбрано.Инъекция зависимостей на лету в ASP.net Core

Например, предположим, что у меня есть этот код в методе Configure в Startup классе моего проекта ASP.net Core:

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

Я использую встроенный каркас DI для asp.net. – Kento

ответ

2

Вы можете получить доступ к ServiceProvider в builder.ApplicationServices. Оттуда вы выбираете экземпляр 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'. Вы можете просто определить метод как «Настроить (IApplicationBuilder, IHostingEnvironment, ILoggerFactory)» –

Смежные вопросы