2016-08-28 11 views
1

IServiceProviderへの参照や依存関係を解決できるクラスをどうにかして依存関係を取得することは可能ですか?たとえば、クライアントに意味のあるものを出力するためにUseExceptionHandlerで例外を処理する場合、スローされた例外についてのいくつかの注意事項を記すカスタムロギングも行いたいと思います。ASP.netコアでの依存関係注入

例えば、私は私のASP.netコアプロジェクトのStartupクラスのConfigure方法でこのコードを持って言うことができます:

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

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'を使う必要はありません。メソッドを 'Configure(IApplicationBuilder、IHostingEnvironment、ILoggerFactory)'として定義することができます –

関連する問題