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

C# MediatR调用Send报错:处理器注册与作用域服务解析问题

MediatR请求处理器解析失败问题排查与解决

核心问题拆解

你遇到的错误看似是“未注册请求处理器”,实际根源是处理器依赖的作用域服务(AppDbContext)无法在当前上下文被解析,MediatR的错误提示只是表象。以下是具体排查和解决方向:


  1. 检查调用MediatR的作用域是否正确
    MediatR默认将处理器注册为瞬时服务,如果你的Send调用是在**根服务容器(非作用域内)**执行(比如在Program.cs启动时直接调用),就会因为无法获取作用域服务AppDbContext而报错。

    • 解决:确保调用_mediator.Send(...)的代码处于作用域内:
      • 在ASP.NET Core的Controller/ApiController中直接调用(控制器本身就是作用域服务)
      • 手动创建作用域再调用:
        using var scope = _serviceProvider.CreateScope();
        var mediator = scope.ServiceProvider.GetRequiredService<IMediator>();
        await mediator.Send(new YourCustomQuery());
        
  2. 修正MediatR的注册方式
    必须确保MediatR扫描到包含Query/Command和对应处理器的程序集,且生命周期匹配:

    • 正确的自动注册方式(推荐):
      // ASP.NET Core 示例
      builder.Services.AddMediatR(cfg => {
          // 扫描包含你的Query/Handler的程序集
          cfg.RegisterServicesFromAssembly(typeof(YourCustomQuery).Assembly);
      });
      
    • 若手动注册处理器,需将其注册为作用域服务(匹配AppDbContext的生命周期):
      builder.Services.AddScoped<IRequestHandler<YourCustomQuery, YourResult>, YourCustomQueryHandler>();
      
  3. 验证处理器类的正确性

    • 确保处理器是public访问修饰符,否则MediatR无法扫描到
    • 确认正确实现对应接口:
      • 有返回值的Query:IRequestHandler<TQuery, TResult>
      • 无返回值的Command:IRequestHandler<TCommand>
    • 示例正确写法:
      public class GetUserQueryHandler : IRequestHandler<GetUserQuery, User>
      {
          private readonly AppDbContext _dbContext;
      
          public GetUserQueryHandler(AppDbContext dbContext)
          {
              _dbContext = dbContext;
          }
      
          public async Task<User> Handle(GetUserQuery request, CancellationToken cancellationToken)
          {
              return await _dbContext.Users.FindAsync(request.Id, cancellationToken);
          }
      }
      
  4. 确认AppDbContext的注册无误

    • 确保AppDbContext是注册为作用域服务(AddDbContext默认就是作用域,不要手动改成瞬时或单例):
      builder.Services.AddDbContext<AppDbContext>(options => 
          options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
      

内容的提问来源于stack exchange,提问作者mr90

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:15:40