C# MediatR调用Send报错:处理器注册与作用域服务解析问题
MediatR请求处理器解析失败问题排查与解决
核心问题拆解
你遇到的错误看似是“未注册请求处理器”,实际根源是处理器依赖的作用域服务(AppDbContext)无法在当前上下文被解析,MediatR的错误提示只是表象。以下是具体排查和解决方向:
检查调用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());
- 解决:确保调用
修正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>();
- 正确的自动注册方式(推荐):
验证处理器类的正确性
- 确保处理器是
public访问修饰符,否则MediatR无法扫描到 - 确认正确实现对应接口:
- 有返回值的Query:
IRequestHandler<TQuery, TResult> - 无返回值的Command:
IRequestHandler<TCommand>
- 有返回值的Query:
- 示例正确写法:
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); } }
- 确保处理器是
确认AppDbContext的注册无误
- 确保AppDbContext是注册为作用域服务(
AddDbContext默认就是作用域,不要手动改成瞬时或单例):builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
- 确保AppDbContext是注册为作用域服务(
内容的提问来源于stack exchange,提问作者mr90
相关产品推荐
相关产品推荐

