ASP.NET Core 2+中的ILogger和DependencyInjection [英] ILogger and DependencyInjection in ASP.NET Core 2+

查看:97
本文介绍了ASP.NET Core 2+中的ILogger和DependencyInjection的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我注意到在 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;}//... 

,并且在激活框架时,框架会将其注入到控制器中.

参考将依赖项注入ASP.NET Core中的控制器

对于中间件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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆