You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}

解决办法

  1. 检查程序集扫描范围
    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);
    });
    
  2. 确认依赖包安装正确
    确保已安装MediatR.Extensions.Microsoft.DependencyInjection——这是MediatR与ASP.NET Core DI集成的官方包,MediatR 12必须依赖它才能自动注册处理器:

    Install-Package MediatR.Extensions.Microsoft.DependencyInjection
    
  3. 验证Query的接口实现
    检查GetUserByIdQuery是否正确继承了IRequest<UserResponse>接口,这是MediatR关联请求与处理器的核心:

    public class GetUserByIdQuery : IRequest<UserResponse>
    {
        public long UserID { get; set; }
    }
    
  4. 检查处理器类的访问修饰符
    确保GetUserByIdQueryHandler是public修饰的,私有/内部类无法被MediatR的程序集扫描机制识别。

  5. 清理并重新生成解决方案
    编译器缓存可能导致程序集扫描不完整,尝试清理解决方案、删除bin/obj目录后重新生成项目。


内容的提问来源于stack exchange,提问作者Mariano Ezequiel Carioni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:58:08