首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从ILogger解析Microsoft.Extensions.Logging

无法从ILogger解析Microsoft.Extensions.Logging
EN

Stack Overflow用户
提问于 2018-10-22 03:16:38
回答 11查看 126.8K关注 0票数 152

我已经将我的控制台应用程序的Main配置如下

代码语言:javascript
复制
var services = new ServiceCollection()
    .AddLogging(logging => logging.AddConsole())
    .BuildServiceProvider();

然后我尝试在另一个类中使用它,像这样

代码语言:javascript
复制
private readonly ILogger _logger;
    
public MyClass(ILogger logger)
{
    _logger = logger;
}

public void MyFunc()
{
    _logger.Log(LogLevel.Error, "My Message");
}

System.InvalidOperationException:“无法解析”Microsoft.Extensions.Logging.ILogger“类型的服务

我尝试过这里的解决方案,但它对我没有用。

编辑基于Yaakov下面的评论和这则Github评论,我可以通过这样做正确地解决这个问题

代码语言:javascript
复制
public MyClass(ILogger<MyClass> logger)
{
    _logger = logger;
}

我本希望在初始的BuildServiceProvider中使用这种方式,但是每次我想使用记录器(或者创建自己的ILogger)时,我似乎都要重复这一点。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2019-08-21 10:56:27

默认情况下,ILogger不再注册,但ILogger<T>注册。如果您仍然想使用ILogger,可以使用以下(在Startup.cs中)手动注册它:

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
{
    var serviceProvider = services.BuildServiceProvider();
    var logger = serviceProvider.GetService<ILogger<AnyClass>>();
    services.AddSingleton(typeof(ILogger), logger);
    ...
}

其中AnyClass可以是通用的,例如:

代码语言:javascript
复制
public class ApplicationLogs
{
}

所以:

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
{
    var serviceProvider = services.BuildServiceProvider();
    var logger = serviceProvider.GetService<ILogger<ApplicationLog>>();
    services.AddSingleton(typeof(ILogger), logger);
    ...
}

ILogger现在将通过构造函数注入进行解析。

票数 164
EN

Stack Overflow用户

发布于 2018-10-22 03:25:54

我假设您使用的是.net核心web应用程序的默认模板。

在您的Startup.cs中,您应该有一个类似于↓↓↓↓↓↓↓的方法

代码语言:javascript
复制
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });


        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        //Do the service register here and extra stuff you want
         services.AddLogging(config =>
        {
            config.AddDebug();
            config.AddConsole();
            //etc
        });

    }

编辑:我已经为你编写了一个简单的程序来展示它是如何工作的。

代码语言:javascript
复制
public class MyClass
{

    private readonly ILogger<MyClass> _logger;


    public MyClass(ILogger<MyClass> logger)
    {
        _logger = logger;
    }
    public void MyFunc()
    {
        _logger.Log(LogLevel.Error, "My Message");
    }
}



public class Program
{
    public static void Main(string[] args)
    {
        var services = new ServiceCollection().AddLogging(logging => logging.AddConsole());
        services.AddSingleton<MyClass>();//Singleton or transient?!
        var s = services.BuildServiceProvider();
        var myclass = s.GetService<MyClass>();
     }
}

编辑:程序的输出:

票数 32
EN

Stack Overflow用户

发布于 2020-07-16 08:20:27

在.NET核心中,ILogger<T>会自动为您注册。由于ILogger<T>继承自ILogger,您可以从IServiceProvider中请求ILogger<T>的实例。

例如:services.AddSingleton<ILogger>(svc => svc.GetRequiredService<ILogger<MyClassType>>());

请注意,只要您有一个非泛型的ILogger<MyClassType>构造函数参数,就会返回一个ILogger,因此,如果需要多个参数,可以使用AddSingleton (或瞬态/或作用域) implementationFactory覆盖来专门为该实例创建它。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52921966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档