web-dev-qa-db-ja.com

ASP.NET Core 2+のILoggerとDependencyInjection

Startup.csILoggerに明示的なConfigureServices登録がないことに気づきました。

最初の質問:ILoggerはどのように注入されますか。コントローラ。

2番目の質問:ミドルウェアに注入されるようにILoggerを構成するにはどうすればよいですか?

8
pomeroy

ロギングは HostBuilder.Build プロセスの一部として追加されます

private void CreateServiceProvider()
{
    var services = new ServiceCollection();
    services.AddSingleton(_hostingEnvironment);
    services.AddSingleton(_hostBuilderContext);
    services.AddSingleton(_appConfiguration);
    services.AddSingleton<IApplicationLifetime, ApplicationLifetime>();
    services.AddSingleton<IHostLifetime, ConsoleLifetime>();
    services.AddSingleton<IHost, Host>();
    services.AddOptions();
    services.AddLogging();//<--HERE

    //...

WebHostBuilder.BuildCommonServices

    private IServiceCollection BuildCommonServices(out AggregateException hostingStartupErrors)
    {

        //... code removed for brevity

        var services = new ServiceCollection();
        services.AddSingleton(_options);
        services.AddSingleton<IHostingEnvironment>(_hostingEnvironment);
        services.AddSingleton<Extensions.Hosting.IHostingEnvironment>(_hostingEnvironment);
        services.AddSingleton(_context);

        var builder = new ConfigurationBuilder()
            .SetBasePath(_hostingEnvironment.ContentRootPath)
            .AddConfiguration(_config);

        _configureAppConfigurationBuilder?.Invoke(_context, builder);

        var configuration = builder.Build();
        services.AddSingleton<IConfiguration>(configuration);
        _context.Configuration = configuration;

        var listener = new DiagnosticListener("Microsoft.AspNetCore");
        services.AddSingleton<DiagnosticListener>(listener);
        services.AddSingleton<DiagnosticSource>(listener);

        services.AddTransient<IApplicationBuilderFactory, ApplicationBuilderFactory>();
        services.AddTransient<IHttpContextFactory, HttpContextFactory>();
        services.AddScoped<IMiddlewareFactory, MiddlewareFactory>();
        services.AddOptions();
        services.AddLogging();

ILoggerをコントローラーに注入するには、それを依存関係としてコンストラクターに含めるだけです

private readonly ILogger logger;

public MyController(ILogger<MyController> logger) {
    this.logger = logger;
}

//...

そして、フレームワークはそれがアクティブ化されているときにそれをコントローラーに注入します。

リファレンス ASP.NET Coreのコントローラーへの依存性注入

同じことは、コントローラーの場合と同じように、ミドルウェアのvaiコンストラクター注入でも行うことができます。

またはInvokeメソッドに直接 リクエストごとの依存関係

public Task Invoke(HttpContext context, ILogger<MyMiddleware> logger) {
    //...
}

他の注入されたサービスのように

リファレンス ASP.NET Core Middleware

11
Nkosi