以下MWE可以正常工作,但是如果我更改,它将引发错误
class Program
至static class Program
GetRequiredService<ILogger<Program>>()
至GetRequiredService<ILogger>()
如何为静态类获取注入的ILogger
?
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按任意键继续。 。
答案 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>
。
我希望能为您澄清一些事情。