首页 > 解决方案 > 为什么在 CreateHostBuilder 中而不是在 ConfigureServices 中设置日志记录?

问题描述

上下文:简单的开箱即用 blazor 3.1 SERVER SIDE 示例 - 添加日志记录(只是试图在组件中的 VS2019 中的调试控制台中获取内容)。

我将 ConfigureServices 保留为原样,并找到了在 program.cs(!) 中设置日志记录的 SO 示例这有效:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging(
                logging =>
                {
                    logging.ClearProviders();
                    logging.AddConsole();
                })

等等。

在我的组件中,一切都解决得很好

[Inject] public ILogger<Foo> Logger { get; set; }

但是为什么不在 ConfigureServices 中,其余的东西,应该是 DI 的,是设置?

  1. 是否有“引擎盖下”的 DI 正在进行?(有点像 .Net 框架 w/webapi 中发生的事情)?
  2. 可以将其移至具有完全相同结果(或根本没有)的 ConfigureServices

标签: c#asp.net-coreblazorblazor-server-side

解决方案


在 ASP.NET core 2.x 中,您可以在 Program.cs 中部分配置依赖注入容器,并将配置的类注入 Startup.cs。因此该方法ConfigureLogging()调用实例,并配置一些设置。由于这些服务是在实例化之前在 DI 容器中配置的,因此可以将它们注入到构造函数中:ConfigureServices()IWebHostBuilderStartupStartup

public Startup(
  IConfiguration configuration, 
  ILogger<Startup> logger) // Inject pre-configured service
{
}

更多的

但是 ASP.NET Core 3.0 不再支持这种方法!问题是它需要构建依赖注入容器两次

  1. 是否有“引擎盖下”的 DI 正在进行?(有点像 .Net 框架 w/webapi 中发生的事情)?

无需搭建服务商的ConfigureLogging公正调用ConfigureServices

public static IWebHostBuilder ConfigureLogging(this IWebHostBuilder hostBuilder, Action<WebHostBuilderContext, ILoggingBuilder> configureLogging)
{
     return hostBuilder.ConfigureServices((context, collection) => collection.AddLogging(builder => configureLogging(context, builder)));
}
  1. 可以将其移至具有完全相同结果(或根本没有)的 ConfigureServices 吗?

是的,你可以把它移到ConfigureServices,结果是一样的

public void ConfigureServices(IServiceCollection services)
{
    services.AddLogging(builder =>
    {
        builder.ClearProviders();
        builder.AddConsole();
    });
}

因此,在哪里添加日志配置取决于您。日志是基础设施,可以作为主机配置添加到 Program.cs。您的业​​务类应该添加到 Startup 中的 DI。


推荐阅读