logging - 在 .NET 5.0 控制台应用程序中调用 ServiceProvider.GetRequiredService 时出现异常
问题描述
Program
经过几个小时尝试查找有关 DI 的信息并登录 .NET 5.0 控制台应用程序后,我在课堂上拼凑了以下代码。与网络应用程序上的信息相比,此类信息非常稀缺:
private static void BuildConfig(IConfigurationBuilder builder)
{
builder.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
.AddEnvironmentVariables();
}
private static void ConfigureServices(ServiceCollection serviceCollection, ILogger logger)
{
serviceCollection
.AddLogging(builder => builder.AddSerilog(logger))
.AddSingleton<ApplicationService>();
}
public static async Task<int> Main(string[] args)
{
// Setup config
var builder = new ConfigurationBuilder();
BuildConfig(builder);
// Setup logging
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(builder.Build())
.CreateLogger();
// Setup Dependency Injection
var serviceCollection = new ServiceCollection();
ConfigureServices(serviceCollection, Log.Logger);
var serviceProvider = serviceCollection.BuildServiceProvider();
// Use dependency injection
var applicationService = serviceProvider.GetRequiredService<ApplicationService>();
var runResult = await applicationService.RunAsync(args);
return runResult;
}
当我尝试运行我的应用程序时,出现以下错误:
System.InvalidOperationException:“尝试激活“DalBuilder.Lib.ApplicationService”时,无法解析“Serilog.ILogger”类型的服务。”
解决方案
很可能在构造函数中使用了错误的记录器ApplicationService
。
重构以使用内置记录器ILogger<ApplicationService>
//...
private readonly ILogger logger; //<-- use build-in logger
public ApplicationService(ILogger<ApplicationService> logger, ....) {
this.logger = logger;
//...
}
记录器的这个配置
//...
.AddLogging(builder => builder.AddSerilog(logger))
//...
基本上是将 Serilog 记录器包装在内置记录器中。
推荐阅读
- c++ - 不使用 * 和 / 运算符将两个浮点数相乘和相除
- dev-null - 这个问题对社区来说并不有趣
- python - 如何使用 Python 打印非常大的 N%M 值?
- java - Java 8 获取不带最后一段的完整 URL 路径(带或不带斜杠)
- c++ - 即使在宏替换后也无法解析变量
- c++ - 如何不删除基类对象的副本?
- javascript - 在 javascript 中简单地获取 GET 请求到烧瓶服务器
- excel - 是否可以创建一个 Excel 宏来打开 Outlook 并搜索文本附件并打开特定的命名文件?
- php - 如何强制设置标题内容长度?
- reactjs - 在 componentDidMount 下更新反应中的对象