我已经像这样配置了控制台应用程序的Main
var services = new ServiceCollection()
.AddLogging(logging => logging.AddConsole())
.BuildServiceProvider();
然后我尝试在另一个类中使用它,就像这样
private readonly ILogger _logger;
public MyClass(ILogger logger)
{
_logger = logger;
}
public void MyFunc()
{
_logger.Log(LogLevel.Error, "My Message");
}
System.InvalidOperationException: 'Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger'
我已经尝试过解决方案 here但它对我不起作用。
编辑 基于雅科夫下面的评论和this Github comment我可以通过这样做正确解决它
public MyClass(ILogger<MyClass> logger)
{
_logger = logger;
}
我更希望在最初的 BuildServiceProvider
中包含此内容,但看起来每次我想使用记录器(或创建我自己的 ILogger)时都必须重复此操作。
最佳答案
ILogger
不再默认注册,而是 ILogger<T>
是。如果您仍然想使用 ILogger,您可以使用以下命令手动注册它(在 Startup.cs
中):
public void ConfigureServices(IServiceCollection services)
{
var serviceProvider = services.BuildServiceProvider();
var logger = serviceProvider.GetService<ILogger<AnyClass>>();
services.AddSingleton(typeof(ILogger), logger);
...
}
哪里AnyClass
可以是通用的东西,例如:
public class ApplicationLogs
{
}
所以:
public void ConfigureServices(IServiceCollection services)
{
var serviceProvider = services.BuildServiceProvider();
var logger = serviceProvider.GetService<ILogger<ApplicationLog>>();
services.AddSingleton(typeof(ILogger), logger);
...
}
ILogger
现在将通过构造函数注入(inject)解析。
关于c# - 无法从 Microsoft.Extensions.Logging 解析 ILogger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52921966/