MediatR 12处理器未注册求助:控制器映射正常但处理器失效
MediatR 12: 无法映射处理器,提示IRequestHandler未注册
问题详情
配置MediatR 12后,控制器能正常注入IMediator,但发送GetUserByIdQuery请求时触发以下错误:
System.InvalidOperationException: No service for type 'MediatR.IRequestHandler`2[ACVOB.Application.Features.User.Queries.GetUserByIdQuery,ACVOB.Domain.User.Queries.UserResponse]' has been registered.
相关代码如下:
Startup配置
public void ConfigureServices(IServiceCollection services) { AddSwagger(services); services.AddRazorPages(); services.AddScoped<UsuarioRepository>(); services.AddScoped<CategoriaRepository>(); services.AddControllers(); services.AddDbContext<ACVOBContext>(options=> options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly())); }
控制器代码
[SwaggerOperation(Summary = "Get user by ID")] [HttpGet("{userId}")] public async Task<IActionResult> GetUsuarioById(long userId) { var request = new GetUserByIdQuery() { UserID = userId }; var response = await _mediator.Send(request); return this.Ok(response); }
处理器代码
public class GetUserByIdQueryHandler : IRequestHandler<GetUserByIdQuery, UserResponse> { private readonly IUserService _userService; public GetUserByIdQueryHandler(IUserService userService) { _userService = userService; } public async Task<UserResponse> Handle(GetUserByIdQuery request, CancellationToken cancellationToken) { return await _userService.GetUserById(request.UserID); } }
解决办法
检查程序集扫描范围
Assembly.GetExecutingAssembly()只会扫描Startup所在的程序集。如果你的GetUserByIdQueryHandler或GetUserByIdQuery位于其他程序集(比如ACVOB.Application),需要指定对应的程序集:// 改用处理器所在的程序集注册 services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(GetUserByIdQueryHandler).Assembly));若需扫描多个程序集,可链式添加:
services.AddMediatR(cfg => { cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()); cfg.RegisterServicesFromAssembly(typeof(GetUserByIdQueryHandler).Assembly); });确认依赖包安装正确
确保已安装MediatR.Extensions.Microsoft.DependencyInjection——这是MediatR与ASP.NET Core DI集成的官方包,MediatR 12必须依赖它才能自动注册处理器:Install-Package MediatR.Extensions.Microsoft.DependencyInjection验证Query的接口实现
检查GetUserByIdQuery是否正确继承了IRequest<UserResponse>接口,这是MediatR关联请求与处理器的核心:public class GetUserByIdQuery : IRequest<UserResponse> { public long UserID { get; set; } }检查处理器类的访问修饰符
确保GetUserByIdQueryHandler是public修饰的,私有/内部类无法被MediatR的程序集扫描机制识别。清理并重新生成解决方案
编译器缓存可能导致程序集扫描不完整,尝试清理解决方案、删除bin/obj目录后重新生成项目。
内容的提问来源于stack exchange,提问作者Mariano Ezequiel Carioni
相关产品推荐
相关产品推荐

