ASP.NET Core 2+中的ILogger和DependencyInjection

问题描述 投票:4回答:1

我注意到在ILoggerConfigureServices没有明确的Startup.cs注册。

第一个问题:如何将ILogger注入例如控制器。

第二个问题:如何配置ILogger以注入中间件?

c# logging asp.net-core dependency-injection
1个回答
8
投票

日志记录作为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;
}

//...

并且框架将在激活时将其注入控制器。

参考Dependency injection into controllers in ASP.NET Core

与控制器一样,Middleware vai构造函数注入也可以这样做,

或直接进入Invokeper-request dependencies方法

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

像任何其他注入的服务

参考ASP.NET Core Middleware

© www.soinside.com 2019 - 2024. All rights reserved.