c# - 为什么在 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 的,是设置?
- 是否有“引擎盖下”的 DI 正在进行?(有点像 .Net 框架 w/webapi 中发生的事情)?
- 可以将其移至具有完全相同结果(或根本没有)的 ConfigureServices吗?
解决方案
在 ASP.NET core 2.x 中,您可以在 Program.cs 中部分配置依赖注入容器,并将配置的类注入 Startup.cs。因此该方法ConfigureLogging()
调用实例,并配置一些设置。由于这些服务是在实例化之前在 DI 容器中配置的,因此可以将它们注入到构造函数中:ConfigureServices()
IWebHostBuilder
Startup
Startup
public Startup(
IConfiguration configuration,
ILogger<Startup> logger) // Inject pre-configured service
{
}
但是 ASP.NET Core 3.0 不再支持这种方法!问题是它需要构建依赖注入容器两次。
- 是否有“引擎盖下”的 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)));
}
- 可以将其移至具有完全相同结果(或根本没有)的 ConfigureServices 吗?
是的,你可以把它移到ConfigureServices
,结果是一样的
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging(builder =>
{
builder.ClearProviders();
builder.AddConsole();
});
}
因此,在哪里添加日志配置取决于您。日志是基础设施,可以作为主机配置添加到 Program.cs。您的业务类应该添加到 Startup 中的 DI。
推荐阅读
- node.js - postgresql 查询在 node.js 中失败,但在 pgadmin 中成功
- vba - 自定义功能区 Visio 2016 时找不到“宏”选项
- python - 多选 Django 不断抛出无效值
- python - 为 Networkx 中的连接组件列表分配编号
- java - google calendar api 说 400 bad request 由于无效值(会议属性)
- node.js - Twilio autopilot whatsapp 使用 nodeJS 发起与电话的对话
- python - Python 线程无法启动
- phoenix-framework - 如何使用 Phoenix LiveView 处理表单文件?
- iis - IIS 10.0 SSI 错误:已为此虚拟路径禁用 #EXEC 调用
- pine-script - 在 Pine Script Tradingview 中使用 Security() 的 EMA 问题