c# - 无法从 Microsoft.Extensions.Logging 解析 ILogger

标签 c# .net dependency-injection .net-core ilogger

我已经像这样配置了控制台应用程序的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/

相关文章:

C# 上传前过滤文件扩展名

.net - Entity Framework 包括 Where 和 3 个表

c# - UseWindowsAzureActiveDirectoryBearerAuthentication 与 UseOpenIdConnectAuthentication 之间有什么区别?

spring - 如何在 Groovy 中使用 Spring DSL 基于环境(dev、qa、prod)注入(inject)依赖?

c# - 在razor View 中,如何将模型属性传递给JavaScript函数并显示返回值?

c# - 如何使用自动映射器将简单的 poco 映射到复杂的对象层次结构?

.net - 将事件参数和发送者传递给 RelayCommand

c# - 我可以将构造函数参数传递给 Unity 的 Resolve() 方法吗?

android - 使用 Dagger 2.x 注入(inject)单例类

c# - 如何在另一个线程中访问 GUI 元素?