MediatR处理器未找到:控制台应用调用Send()时注册异常排查
MediatR调用
.Send()时“未注册请求处理器”异常的解决 项目结构
awesome-project Awesome.Project.App Program.cs Awesome.Project.Domain Commands/ Handlers/
异常信息
Unhandled exception. System.AggregateException: One or more errors occurred. (No service for type 'MediatR.IRequestHandler`2[Awesome.Project.Domain.Commands.RequestBillCommand,System.String]' has been registered.)
现有注册代码(Program.cs)
using Awesome.Project.Domain.Commands; using Microsoft.Extensions.DependencyInjection; using MediatR; using System.Reflection; namespace Awesome.Project.App { public class Program { public static void Main(string[] args) { Run().Wait(); } private static async Task Run() { var serviceCollection = new ServiceCollection(); ConfigureServices(serviceCollection); var serviceProvider = serviceCollection.BuildServiceProvider(); var mediator = serviceProvider.GetRequiredService<IMediator>(); var command = new RequestBillCommand(); await mediator.Send(command); } public static void ConfigureServices(IServiceCollection services) { services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(Program).Assembly)); } } }
命令类与处理器类
命令类
public class RequestBillCommand : IRequest<string> { // ... }
处理器类
public class RequestBillHandler : IRequestHandler<RequestBillCommand, string> { // 必须实现Handle方法 public Task<string> Handle(RequestBillCommand request, CancellationToken cancellationToken) { // 业务逻辑实现 return Task.FromResult("处理结果"); } }
问题原因与解决步骤
问题核心
当前代码仅注册了Awesome.Project.App项目的程序集,但请求处理器RequestBillHandler位于Awesome.Project.Domain项目中,MediatR无法扫描到该程序集内的处理器类型。
解决方法
修改ConfigureServices方法,将Domain项目的程序集也加入MediatR的扫描范围:
方法1:逐个注册程序集
public static void ConfigureServices(IServiceCollection services) { services.AddMediatR(cfg => { // 注册App项目程序集 cfg.RegisterServicesFromAssembly(typeof(Program).Assembly); // 注册Domain项目程序集(通过命令类或处理器类获取程序集) cfg.RegisterServicesFromAssembly(typeof(RequestBillCommand).Assembly); }); }
方法2:批量注册多个程序集
public static void ConfigureServices(IServiceCollection services) { var targetAssemblies = new[] { typeof(Program).Assembly, typeof(RequestBillHandler).Assembly }; services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(targetAssemblies)); }
额外注意事项
- 确保处理器类
RequestBillHandler是公共访问修饰符(public),否则MediatR无法扫描到。 - 必须实现
IRequestHandler接口的Handle方法,否则即使注册了程序集,也无法被识别为有效的处理器。
内容的提问来源于stack exchange,提问作者placplacboom
相关产品推荐
相关产品推荐

