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

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

额外注意事项

  1. 确保处理器类RequestBillHandler是公共访问修饰符(public),否则MediatR无法扫描到。
  2. 必须实现IRequestHandler接口的Handle方法,否则即使注册了程序集,也无法被识别为有效的处理器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:50:22