如何为静态类获取注入的ILogger?

时间:2019-03-03 16:31:35

标签: c# logging dependency-injection .net-core

以下MWE可以正常工作,但是如果我更改,它将引发错误

  • class Programstatic class Program

  • GetRequiredService<ILogger<Program>>()GetRequiredService<ILogger>()

问题

如何为静态类获取注入的ILogger

最小工作示例(MWE)

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;


class Application
{
    readonly ILogger logger;

    public Application(ILogger<Application> logger) => this.logger = logger;

    public void Say(string str)
    {
        Console.WriteLine(str);
        logger.LogError(str);
    }
}

class Program
{
    static void Main(string[] args)
    {
        using (var services = ConfigureServices())
        {
            services.GetRequiredService<ILogger<Program>>().LogInformation("Main");

            services.GetRequiredService<Application>().Say("Hello World");
        }
    }

    static ServiceProvider ConfigureServices()
    {
        IServiceCollection sc = new ServiceCollection()
          .AddLogging(x => x.AddConsole())
          .AddTransient<Application>();

        return sc.BuildServiceProvider();
    }
}
  

未处理的异常:System.InvalidOperationException:无服务   类型“ Microsoft.Extensions.Logging.ILogger”已注册。在   Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider   提供者,输入serviceType)   Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService [T](IServiceProvider   提供程序)在Logging.Program.Main(String [] args)中   F:... \ LoggingPractice \ Program.cs:line 24按任意键继续。   。

1 个答案:

答案 0 :(得分:1)

为什么要使程序类静态化?通常不是。如果从.net核心模板创建控制台应用程序,则它不是静态类。

要回答你的第一点……如果使程序静态化……那么you can't use a static class as a type argument

要回答为什么尝试在没有类型参数的情况下解析ILogger会得到异常的原因……You shouldn't be able to!请参阅链接-ILogger总是输入的,除非您指定类型(否则您不会输入),否则它不会解决您尝试解析它的方式。

例外是告诉您ServiceProvider不知道如何解析ILogger。但是,如果您提供类型参数,它确实知道如何解决它。 ILogger<MyClass>

我希望能为您澄清一些事情。