私はロガープロバイダにIServiceProviderを注入し、CreateLogger
が呼び出されたときに、私のロガーを解決するが、それはすべてのasp.netコアで2.0どうすればasp.netコア2.0のカスタムILoggerに依存関係を注入できますか? asp.netコア1.1では
を変えマイILoggerです実装では、注入された依存関係を必要とすることができます。 これをどうすれば実現できますか?
私はロガープロバイダにIServiceProviderを注入し、CreateLogger
が呼び出されたときに、私のロガーを解決するが、それはすべてのasp.netコアで2.0どうすればasp.netコア2.0のカスタムILoggerに依存関係を注入できますか? asp.netコア1.1では
を変えマイILoggerです実装では、注入された依存関係を必要とすることができます。 これをどうすれば実現できますか?
ASP.NETコアでは、組み込みDIコンテナをカスタムコンテナに置き換えることができます(詳細については、thisの記事を参照してください)。標準の.NetコアDIコンテナを使用している間に、この可能性を使用して、ブートストラップをログに記録するために、先にIServiceProvider
のインスタンスを取得することができます。
これを行うには、Startup.ConfigureServices(IServiceCollection services)
メソッドの戻り値をvoidからIServiceProvider
に変更する必要があります。この可能性を使用して、ConfigureServicesでIServiceProviderのインスタンスを作成し、ブートストラップをログに記録してからメソッドから戻すことができます。
サンプルコード:
public interface ISomeDependency
{
}
public class SomeDependency : ISomeDependency
{
}
public class CustomLogger : ILogger
{
public CustomLogger(ISomeDependency dependency)
{
}
// ...
}
public class CustomLoggerProvider : ILoggerProvider
{
private readonly IServiceProvider serviceProvider;
public CustomLoggerProvider(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
}
public ILogger CreateLogger(string categoryName)
{
return serviceProvider.GetRequiredService<ILogger>();
}
// ...
}
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc();
return ConfigureLogging(services);
}
private IServiceProvider ConfigureLogging(IServiceCollection services)
{
services.AddTransient<ISomeDependency, SomeDependency>();
services.AddSingleton<ILogger, CustomLogger>();
IServiceProvider serviceProvider = services.BuildServiceProvider();
var loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new CustomLoggerProvider(serviceProvider));
return serviceProvider;
}
// ...
}
しかし、私の問題は、依存関係がまだ登録されていないので、ConfigureLoggingがConfigureServices前に呼び出されていることです。 – Clement
入手しました。私の答えの更新を確認してください。 – CodeFuller
ここで使用しているConfigureLogging拡張メソッドを参照していました。https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?tabs=aspnetcore2x – Clement