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

.NET 6 Web API中独立项目MediatR用例的注册异常问题

解决MediatR在Clean Architecture .NET 6 Web API中的注册问题

问题根源分析

  • 第一种注册方式(typeof(ApplicationAssembly).GetTypeInfo().Assembly)抛出AggregateException,通常是Handler的依赖项未在DI容器中注册,或是程序集引用逻辑有误;
  • 第二种注册方式(typeof(Program))报错找不到Handler,是因为Program属于Web API项目,而所有Queries/Commands/Handler都在独立的Application项目中,MediatR无法扫描到跨项目的Handler实现。

解决方案步骤

1. 确保ApplicationAssembly类正确定义

在Application项目中创建一个空类,用于标记程序集(确保Web API项目已正确引用Application项目):

namespace SalaryTracker.Application;
// 空类,仅用于标记Application程序集
public class ApplicationAssembly { }

2. 修正MediatR注册代码

使用.NET 6原生的Assembly属性替代过时的GetTypeInfo().Assembly,并显式指定扫描Application程序集:

public static class ServicesConfigurator
{
    public static void Configure(WebApplicationBuilder builder)
    {
        builder.Services.AddControllers();
        builder.Services.AddEndpointsApiExplorer();
        builder.Services.AddSwaggerGen();

        builder.Services.AddAutoMapper(typeof(ApplicationAssembly));

        // 正确注册MediatR,扫描Application项目的所有Handler
        builder.Services.AddMediatR(cfg => 
        {
            cfg.RegisterServicesFromAssembly(typeof(ApplicationAssembly).Assembly);
        });

        // 关键:注册Infrastructure层的依赖(如仓储、数据库上下文等)
        // 示例:builder.Services.AddScoped<IUserRepository, UserRepository>();
    }
}

3. 排查Handler依赖与实现

  • 确认Handler类正确实现IRequestHandler<TRequest, TResponse>接口:
    public class GetUserHandler : IRequestHandler<GetUser, UserWrapperDataView>
    {
        private readonly IUserRepository _userRepository;
    
        // 依赖注入仓储接口
        public GetUserHandler(IUserRepository userRepository)
        {
            _userRepository = userRepository;
        }
    
        public async Task<UserWrapperDataView> Handle(GetUser request, CancellationToken cancellationToken)
        {
            // 业务逻辑实现
        }
    }
    
  • 所有Handler构造函数中的依赖项(如IUserRepository)必须在DI容器中注册(通常在Infrastructure项目的服务配置类中完成)。

4. 定位AggregateException的具体原因

捕获并打印AggregateException的内部异常,获取精准错误信息:

try
{
    var builder = WebApplication.CreateBuilder(args);
    ServicesConfigurator.Configure(builder);

    var app = builder.Build();

    // 中间件配置...

    app.Run();
}
catch (AggregateException ex)
{
    foreach (var innerEx in ex.InnerExceptions)
    {
        Console.WriteLine($"错误详情:{innerEx.Message}");
        Console.WriteLine($"堆栈跟踪:{innerEx.StackTrace}");
    }
}

内容的提问来源于stack exchange,提问作者K.Z

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:02:09