问题描述
我已经这样配置了控制台应用程序的 Main
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");
}
我已经尝试过解决方案,但它对我不起作用。
I've tried the solutions here but it didn't work for me.
编辑 >
基于Yaakov的以下注释和此Github评论通过执行此操作,我可以正确解决此问题
EditBased 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;
}
我更希望在最初的中使用它BuildServiceProvider
,但是每次我想使用记录器(或创建自己的ILogger)时,我都要重复一次。
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
不再默认注册,但 ILogger< T>
已注册。如果仍要使用ILogger,则可以使用以下(Startup.cs)手动注册它:
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);
...
}
AnyClass可以是通用的东西,例如:
Where AnyClass can be something generic, such as:
public class ApplicationLogs
{
}
因此:
public void ConfigureServices(IServiceCollection services)
{
var serviceProvider = services.BuildServiceProvider();
var logger = serviceProvider.GetService<ILogger<ApplicationLog>>();
services.AddSingleton(typeof(ILogger), logger);
...
}
ILogger现在将通过构造函数注入进行解析
ILogger will now resolve via constructor injection
这篇关于无法从Microsoft.Extensions.Logging解析ILogger的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!