如何在范围服务中使用 Microsoft.Extensions.LoggingLogger

Fab*_*uez 0 c# logging asp.net-core

在 .Net 5 Web API 中,我尝试在范围服务中进行日志记录。

我首先尝试通过构造函数依赖注入引入记录器服务:

using Microsoft.Extensions.Logging;

public class SmsService : ISmsService
{
    private readonly ILogger _logger;

    public SmsService(ILogger logger)
    {
        _logger = logger;
    }
}
Run Code Online (Sandbox Code Playgroud)

但当我运行 API 时,出现以下异常:

System.AggregateException:“无法构造某些服务(验证服务描述符时出错”ServiceType:PropWorx.API.Interfaces.ISmsService Lifetime:作用域实现类型:PropWorx.API.Services.SmsService”:无法解析类型的服务尝试激活“PropWorx.API.Services.SmsService”时出现“Microsoft.Extensions.Logging.ILogger”。)”

然后我删除了依赖注入,并尝试在日志记录时创建一个范围:

private readonly IServiceProvider _serviceProvider;

using (var scope = _serviceProvider.CreateScope())
{
    using (var logger = scope.ServiceProvider.GetRequiredService<ILogger>())
    {
        logger.LogError("some error message");
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到这个编译时错误:

CS1674“ILogger”:using 语句中使用的类型必须可隐式转换为“System.IDisposable”。

有任何想法吗?

Ath*_*ras 5

关于你的第一次尝试

该代码看起来合法。我的猜测是,您没有使用具体实现来配置 DI 容器,因此ILogger在实例化时,它不知道ILogger要创建哪个类型的对象。

您可以在此处查看如何配置和添加默认日志记录提供程序。

关于你的第二次尝试

以下是GetRequiredService的定义

public static T GetRequiredService<T> (this IServiceProvider provider);
Run Code Online (Sandbox Code Playgroud)

您可以看到它返回T,在您的情况下是ILogger接口。创建的实例不是Disposable的,因此不能在using声明中使用。

尝试这样使用它:

using (var scope = _serviceProvider.CreateScope())
{
    var logger = scope.ServiceProvider.GetRequiredService<ILogger>();
    logger.LogError("some error message");

}
Run Code Online (Sandbox Code Playgroud)

请提供注入配置ILogger(意味着您提供正在使用的具体实现的定义ILogger,以帮助您完成第一个示例。