2017-11-15 11 views

答えて

0

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; 
    } 

    // ... 
} 
+0

しかし、私の問題は、依存関係がまだ登録されていないので、ConfigureLoggingがConfigureServices前に呼び出されていることです。 – Clement

+0

入手しました。私の答えの更新を確認してください。 – CodeFuller

+0

ここで使用しているConfigureLogging拡張メソッドを参照していました。https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?tabs=aspnetcore2x – Clement

関連する問題