.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
相关产品推荐
相关产品推荐

