无法从 Microsoft.Extensions.Logging 解析 ILogger [英] Unable to resolve ILogger from Microsoft.Extensions.Logging
问题描述
我已经像这样配置了我的控制台应用程序的 Main
var services = new ServiceCollection().AddLogging(logging => logging.AddConsole()).BuildServiceProvider();
然后我尝试在另一个类中使用它
private readonly ILogger _logger;公共 MyClass(ILogger 记录器){_logger = 记录器;}公共无效 MyFunc(){_logger.Log(LogLevel.Error, "我的消息");}
<块引用>
System.InvalidOperationException: '无法解析服务类型'Microsoft.Extensions.Logging.ILogger'
我已经尝试了此处的解决方案,但对我不起作用.
编辑基于 Yaakov 在下面的评论和 this Github comment 我能够通过这样做来正确解决它
public MyClass(ILogger logger){_logger = 记录器;}
我更希望在最初的 BuildServiceProvider
中有这个,但看起来每次我想使用记录器(或创建我自己的 ILogger)时我都必须重复这个.>
ILogger
不再默认注册,但 ILogger
是.如果您仍想使用 ILogger,您可以使用以下 (Startup.cs) 手动注册:
public void ConfigureServices(IServiceCollection services){var serviceProvider = services.BuildServiceProvider();var logger = serviceProvider.GetService>();services.AddSingleton(typeof(ILogger), logger);...}
其中 AnyClass 可以是通用的,例如:
公共类 ApplicationLogs{}
所以:
public void ConfigureServices(IServiceCollection services){var serviceProvider = services.BuildServiceProvider();var logger = serviceProvider.GetService>();services.AddSingleton(typeof(ILogger), logger);...}
ILogger 现在将通过构造函数注入解析
I've configured my console application's Main
like so
var services = new ServiceCollection()
.AddLogging(logging => logging.AddConsole())
.BuildServiceProvider();
And then I try to use it in another class like so
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'
I've tried the solutions here but it didn't work for me.
Edit Based on Yaakov's comment below and this Github comment I'm able to resolve it correctly by doing this
public MyClass(ILogger<MyClass> logger)
{
_logger = logger;
}
I would have preferred to have this in the initial BuildServiceProvider
but looks like I'm gonna have to repeat this every time I want to use the logger (or create my own ILogger).
ILogger
is no longer registered by default but ILogger<T>
is. If you still want to use ILogger you can registered it manually with the following (Startup.cs):
public void ConfigureServices(IServiceCollection services)
{
var serviceProvider = services.BuildServiceProvider();
var logger = serviceProvider.GetService<ILogger<AnyClass>>();
services.AddSingleton(typeof(ILogger), logger);
...
}
Where AnyClass can be something generic, such as:
public class ApplicationLogs
{
}
So:
public void ConfigureServices(IServiceCollection services)
{
var serviceProvider = services.BuildServiceProvider();
var logger = serviceProvider.GetService<ILogger<ApplicationLog>>();
services.AddSingleton(typeof(ILogger), logger);
...
}
ILogger will now resolve via constructor injection
这篇关于无法从 Microsoft.Extensions.Logging 解析 ILogger的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!