Startup.cs
のILogger
に明示的なConfigureServices
登録がないことに気づきました。
最初の質問:ILogger
はどのように注入されますか。コントローラ。
2番目の質問:ミドルウェアに注入されるようにILogger
を構成するにはどうすればよいですか?
ロギングは 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