无法从 Microsoft.Extensions.Logging 解析 ILogger [英] Unable to resolve ILogger from Microsoft.Extensions.Logging

查看:40
本文介绍了无法从 Microsoft.Extensions.Logging 解析 ILogger的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆