无法解析 Microsoft.Extensions.Logging.ILogger 类型的服务

问题描述 投票:0回答:2

我正在构建一个独立的应用程序,它连接到另一个项目以提交最终插入数据库的项目(其中包含许多事件处理程序,但我不直接调用它们,它们由我调用的命令引用) 。当我通过 MediatR 调用相关命令时,出现以下错误:

无法解析类型的服务 'Microsoft.Extensions.Logging.ILogger

1[TransactionBehavior
2[SubmitItemCommand,SubmitItemCommandResponse]]' 尝试激活时 'TransactionBehavior`2[SubmitItemCommand,SubmitItemCommandResponse]'。

我的应用程序中有一个启动类,如下所示:

public ServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddMediatR(typeof(Startup));

    services.AddTransient(typeof(IPipelineBehavior<,>), typeof(TransactionBehavior<,>));

    ...           

    return services.BuildServiceProvider();
}

相关命令如下:

public class TransactionBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : Command<TResponse>
{
    private readonly ILogger<TransactionBehavior<TRequest, TResponse>> _logger;

    public TransactionBehavior(ILogger<TransactionBehavior<TRequest, TResponse>> logger)
    {
        _logger = logger ?? throw new ArgumentException(nameof(logger));
    }

    public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
    {
        try
        {
            ...
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error handling transaction for {CommandName} ({@Command})", request.GetType().Name, request);

            throw;
        }
    }
}

我尝试了多种解决方案,包括向 ILogger 的服务配置添加一个项目,但是当我这样做时,我收到以下错误:

无法实例化实现类型 'Microsoft.Extensions.Logging.ILogger

1[TransactionBehavior
2[SubmitItemCommand,SubmitItemCommandResponse]]' 对于服务类型 'Microsoft.Extensions.Logging.ILogger
1[TransactionBehavior
2[SubmitItemCommand,SubmitItemCommandResponse]]'

.

logging mediatr ilogger
2个回答
3
投票

以防万一其他人有类似的错误,我可以通过添加来修复此问题

services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));

到我的startup.cs。

我认为我必须添加引用特定类的 ILogger,这会生成第二个错误,但只需添加通用版本即可解决所有问题。


0
投票

对于 .NET 8,并以 Jimminybob 的答案为基础:如果您确实想使用

Logger<SomeClass>
,请按照上面的说明在 Program.cs 中添加两行,

var builder = WebApplication.CreateBuilder(args)
...
services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
...
var app = builder.Build();

并更新控制器/服务/存储库的构造函数:

using Microsoft.Extensions.Logging;

public AuthController(
    IConfiguration configuration,
    ILogger<AuthController> logger,
    ILoggerFactory loggerFactory,
    IActionContextAccessor actionContext) 
{
    _logger = logger;
    someRepository = new SomeRepository(arg1, new Logger<SomeRepository>(loggerFactory));
    someService = new SomeService(arg1, someRepository, new Logger<SomeService>(loggerFactory));
     etc;
}

然后在SomeRepository和SomeService的声明中:

public class SomeRepository : ISomeRepository
{
    private readonly ILogger _logger;
    
    public SomeRepository(string arg1, ILogger<SomeRepository> logger)
    {
        _logger = logger;
        etc...
    }
}

正在生成的确切错误消息System.AggregateException:“无法构造某些服务(验证服务描述符时出错”ServiceType:SomeNamespace.Server.Services.IAuthService Lifetime:作用域实现类型:SomeNamespace.Server.Services.AuthService”:无法解析服务尝试激活“SomeNamespace.Server.Services.AuthService”时键入“Microsoft.Extensions.Logging.ILogger”。)'

© www.soinside.com 2019 - 2024. All rights reserved.