.NET Core 7 Minimal API中MediatR请求处理器映射失败求助
.NET Core 7 Minimal API 中 MediatR 命令处理器映射失败问题
错误信息
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1] An unhandled exception has occurred while executing the request. System.InvalidOperationException: Error constructing handler for request of type MediatR.IRequestHandler`2[mNet.FileServer.Commands.Core.Application.Features.StoredFileTypes.NewStoredFileType.NewStoredFileTypeCommand,mNet.Common.Core.Application.Commands.BaseCommandResponse`1[mNet.FileServer.Shared.Core.Domain.StoredFileTypes.ValueObjects.StoredFileTypeId]]. Register your handlers with the container. See the samples in GitHub for examples. ---> System.InvalidOperationException: No service for type 'MediatR.IRequestHandler`2[mNet.FileServer.Commands.Core.Application.Features.StoredFileTypes.NewStoredFileType.NewStoredFileTypeCommand,mNet.Common.Core.Application.Commands.BaseCommandResponse`1[mNet.FileServer.Shared.Core.Domain.StoredFileTypes.ValueObjects.StoredFileTypeId]]' has been registered. at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) at MediatR.ServiceFactoryExtensions.GetInstance[T](ServiceFactory factory) at MediatR.Wrappers.HandlerBase.GetHandler[THandler](ServiceFactory factory) --- End of inner exception stack trace --- at MediatR.Wrappers.HandlerBase.GetHandler[THandler](ServiceFactory factory) at MediatR.Wrappers.RequestHandlerWrapperImpl`2.<>c__DisplayClass1_0.<Handle>g__Handler|0() at MediatR.Pipeline.RequestExceptionProcessorBehavior`2.Handle(TRequest request, RequestHandlerDelegate`1 next, CancellationToken cancellationToken) at MediatR.Pipeline.RequestExceptionProcessorBehavior`2.Handle(TRequest request, RequestHandlerDelegate`1 next, CancellationToken cancellationToken) at MediatR.Pipeline.RequestExceptionActionProcessorBehavior`2.Handle(TRequest request, RequestHandlerDelegate`1 next, CancellationToken cancellationToken) at MediatR.Pipeline.RequestExceptionActionProcessorBehavior`2.Handle(TRequest request, RequestHandlerDelegate`1 next, CancellationToken cancellationToken) at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request, RequestHandlerDelegate`1 next, CancellationToken cancellationToken) at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request, RequestHandlerDelegate`1 next, CancellationToken cancellationToken) at mNet.FileServer.Commands.Ui.MinimalApi.Endpoints.StoredFileTypeEndpoint.NewStoredFileTypeAsync(NewStoredFileTypeDto request, IMediator mediator) in C:\Users\dcmea\OneDrive\mNet Microservices\mNet.FileServer\mNet.FileServer.Commands.Ui.MinimalApi\Endpoints\StoredFileTypeEndpoint.cs:line 47 at Microsoft.AspNetCore.Http.RequestDelegateFactory.<ExecuteTaskOfT>g__ExecuteAwaited|111_0[T](Task`1 task, HttpContext httpContext) at Microsoft.AspNetCore.Http.RequestDelegateFactory.<>c__DisplayClass89_2.<<HandleRequestBodyAndCompileRequestDelegateForJson>b__2>d.MoveNext() --- End of stack trace from previous location --- at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger) at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext) at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider) at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
项目结构
- mNet.Common.Core.Application: 包含
BaseCommand和BaseCommandResponse类 - mNet.FileServer.Shared.Core.Domain: 包含
StoredFileTypeId值对象 - mNet.FileServer.Commands.Core.Domain: 包含
StoredFileType聚合根 - mNet.FileServer.Commands.Core.Application: 包含
NewStoredFileTypeCommand和NewStoredFileTypeCommandHandler类 - mNet.FileServer.Commands.Ui.MinimalApi: 包含主
Program.cs和Minimal API端点
关键代码片段
Program.cs(片段)
builder.Services.AddMediatR(AppDomain.CurrentDomain.GetAssemblies());
Minimal API端点方法
private static async Task<BaseCommandResponse<StoredFileTypeId>> NewStoredFileTypeAsync(NewStoredFileTypeDto request, IMediator mediator) { var messageId = Guid.NewGuid(); var command = new NewStoredFileTypeCommand { Id = new MessageId(messageId), CorrelationId = new CorrelationId(messageId), CausationId = new CausationId(messageId), CommandDto = request }; var response = await mediator.Send(command); // 错误发生在此行,对应日志第47行 return response; }
NewStoredFileTypeCommand类
public class NewStoredFileTypeCommand : BaseCommand, IRequest<BaseCommandResponse<StoredFileTypeId>> { public NewStoredFileTypeDto CommandDto { get; init; } = default!; }
NewStoredFileTypeCommandHandler类
public class NewStoredFileTypeCommandHandler : IRequestHandler<NewStoredFileTypeCommand, BaseCommandResponse<StoredFileTypeId>> { private readonly IMapper _mapper; private readonly IEventSourcingHandler<StoredFileType, StoredFileTypeId> _eventSourcingHandler; public NewStoredFileTypeCommandHandler(IMapper mapper, IEventSourcingHandler<StoredFileType, StoredFileTypeId> eventSourcingHandler) { _mapper = mapper; _eventSourcingHandler = eventSourcingHandler; } public async Task<BaseCommandResponse<StoredFileTypeId>> Handle(NewStoredFileTypeCommand request, CancellationToken cancellationToken) { var response = new BaseCommandResponse<StoredFileTypeId>(); var aggregate = new StoredFileType( new StoredFileTypeId(Guid.NewGuid()), request.CorrelationId, new CausationId(request.Id.Id), request.CommandDto.Name, request.CommandDto.IsImageFileType, _mapper.Map<BootstrapIconCode>(request.CommandDto.BootstrapIconCode), _mapper.Map<MimeType>(request.CommandDto.MimeType) ); await _eventSourcingHandler.SaveAsync(aggregate); response.Id = aggregate.Id; response.Message = $"Created new {nameof(StoredFileType)} aggregate!"; response.IsSuccessful = true; return response; } }
问题说明
调试后确认MediatR未能将NewStoredFileTypeCommandHandler映射到对应的NewStoredFileTypeCommand,但已在Program.cs中配置了AppDomain.CurrentDomain.GetAssemblies()来扫描所有程序集,暂时无法定位原因,求排查思路。
内容的提问来源于stack exchange,提问作者dmeadley
相关产品推荐
相关产品推荐

