我正在构建一个独立的应用程序,它连接到另一个项目以提交最终插入数据库的项目(其中包含许多事件处理程序,但我不直接调用它们,它们由我调用的命令引用) 。当我通过 MediatR 调用相关命令时,出现以下错误:
无法解析类型的服务 'Microsoft.Extensions.Logging.ILogger
2[SubmitItemCommand,SubmitItemCommandResponse]]' 尝试激活时 'TransactionBehavior`2[SubmitItemCommand,SubmitItemCommandResponse]'。1[TransactionBehavior
我的应用程序中有一个启动类,如下所示:
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
2[SubmitItemCommand,SubmitItemCommandResponse]]' 对于服务类型 'Microsoft.Extensions.Logging.ILogger1[TransactionBehavior
2[SubmitItemCommand,SubmitItemCommandResponse]]'1[TransactionBehavior
.
以防万一其他人有类似的错误,我可以通过添加来修复此问题
services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
到我的startup.cs。
我认为我必须添加引用特定类的 ILogger,这会生成第二个错误,但只需添加通用版本即可解决所有问题。
对于 .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”。)'