ASP.NET Core 2+中的ILogger和DependencyInjection [英] ILogger and DependencyInjection in ASP.NET Core 2+
问题描述
我注意到在 Startup.cs
的 ConfigureServices
中没有明确的 ILogger
注册.
第一个问题: ILogger
如何注入到例如控制器.
第二个问题:如何配置 ILogger
注入中间件?
日志记录被添加为 WebHostBuilder.BuildCommonServices
私有IServiceCollection BuildCommonServices(出AggregateException HostingStartupErrors){//...为简洁起见,删除了代码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>(配置);_context.Configuration =配置;var listener = new DiagnosticListener("Microsoft.AspNetCore");services.AddSingleton< DiagnosticListener>(侦听器);services.AddSingleton< DiagnosticSource>(侦听器);services.AddTransient< IApplicationBuilderFactory,ApplicationBuilderFactory>();services.AddTransient< IHttpContextFactory,HttpContextFactory>();services.AddScoped< IMiddlewareFactory,MiddlewareFactory>();services.AddOptions();services.AddLogging();
要将 ILogger
注入到控制器中,只需将其作为依赖项包含在构造函数中
私有只读ILogger记录器;公共MyController(ILogger< MyController>记录器){this.logger = logger;}//...
,并且在激活框架时,框架会将其注入到控制器中.
对于中间件vai构造函数注入,可以像使用控制器一样进行
或直接进入 ASP.NET核心中间件 >
I notice there is no explicit ILogger
registration in ConfigureServices
in Startup.cs
.
First question: how does ILogger
get injected into e.g. controllers.
Second question: how do I configure ILogger
to get injected into middleware?
Logging is added as part of the HostBuilder.Build process
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();
To get ILogger
injected into a controller just include it in the constructor as a dependency
private readonly ILogger logger;
public MyController(ILogger<MyController> logger) {
this.logger = logger;
}
//...
and the framework will inject it into the controller when it is being activated.
Reference Dependency injection into controllers in ASP.NET Core
The same can be done for Middleware vai constructor injection just like with the controller,
or directly into the Invoke
method for per-request dependencies
public Task Invoke(HttpContext context, ILogger<MyMiddleware> logger) {
//...
}
like any other injected service
Reference ASP.NET Core Middleware
这篇关于ASP.NET Core 2+中的ILogger和DependencyInjection的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!