为什么在CreateHostBuilder中而不是在ConfigureServices中设置日志记录



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

我保持ConfigureServices的原样,并发现了在程序.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'ed的其余内容呢???

  1. 是否存在"隐藏"DI?(有点像在.Net framework-webapi中进行(
  2. 是否可以将其移动到ConfigureServices,且excact结果相同(或(

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

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

更多

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

  1. 是否存在"隐藏"DI?(有点像发生的事情在.Net framework-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。

相关内容

  • 没有找到相关文章