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?
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