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

var services = new ServiceCollection()
    .AddLogging(logging => logging.AddConsole())
    .BuildServiceProvider();

然后我试着在另一门课上使用它

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’

我try 了here种解决方案,但对我无效.

Edit

public MyClass(ILogger<MyClass> logger)
{
    _logger = logger;
}

我更愿意将其放在最初的BuildServiceProvider中,但是看起来每次我想要使用记录器(或者创建我自己的ILogger)时都必须重复这一点.

推荐答案

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

public void ConfigureServices(IServiceCollection services)
{
    var serviceProvider = services.BuildServiceProvider();
    var logger = serviceProvider.GetService<ILogger<AnyClass>>();
    services.AddSingleton(typeof(ILogger), logger);
    ...
}

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

public class ApplicationLogs
{
}

所以:

public void ConfigureServices(IServiceCollection services)
{
    var serviceProvider = services.BuildServiceProvider();
    var logger = serviceProvider.GetService<ILogger<ApplicationLog>>();
    services.AddSingleton(typeof(ILogger), logger);
    ...
}

ILogger现在将通过构造函数注入解决.

.net相关问答推荐

MSBuild:CopyToOutputDirectory不会将本机DLL复制到输出

跨请求共享数据

在平板电脑上运行我的 Angular 13 和 .Net Api 项目时,它不会向 api 输入请求

.NET MAUI ListView - ObservableCollection - 在异步方法期间不更新

是否存在指定的(子)索引分隔符?

在 C# 中生成随机小数

Gacutil.exe 成功添加程序集,但在资源管理器中无法查看程序集.为什么?

将毫秒转换为人类可读的时间间隔

如何在 C# 中创建表达式树来表示String.Contains("term")?

在 .NET C# 中存储加密密钥的最佳方式

多个等待与 Task.WaitAll - 等效?

C# 相当于 Java 的 <?在泛型中扩展 Base>

基于多个字符分隔符拆分字符串

软件包版本始终为 1.0.0,带有 dotnet pack

有没有办法从方法返回匿名类型?

无法使用 Unity 将依赖项注入 ASP.NET Web API 控制器

.NET 的黄瓜替代品

如何使用 Entity Framework Code First CTP 5 存储图像?

如何重新启动我的 C# WinForm 应用程序?

WinForms 中的模型视图演示者