web-dev-qa-db-fra.com

ILogger et DependencyInjection dans ASP.NET Core 2+

Je constate qu'il n'y a pas d'enregistrement explicite de ILogger dans ConfigureServices dans Startup.cs.

Première question: comment ILogger est-il injecté par exemple contrôleurs.

Deuxième question: comment configurer ILogger pour qu'il soit injecté dans le middleware?

8
pomeroy

La journalisation est ajoutée dans le cadre du processus 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();

Pour obtenir ILogger injecté dans un contrôleur, il suffit de l'inclure dans le constructeur en tant que dépendance

private readonly ILogger logger;

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

//...

et le framework l'injectera dans le contrôleur lors de son activation.

Référence injection de dépendance dans les contrôleurs dans ASP.NET Core

La même chose peut être faite pour l'injection de constructeur Middleware vai comme avec le contrôleur,

ou directement dans la méthode Invoke pour dépendances par demande

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

comme tout autre service injecté

Référence ASP.NET Core Middleware

11
Nkosi