.NET 6中如何注入/注册MediatR ServiceFactory?(从.NET Core 3.1迁移)
.NET 6中正确注册MediatR ServiceFactory的方法
你遇到的错误根源在于:MediatR.ServiceFactory本质是一个委托类型(定义为Func<Type, object>),而非可被DI容器实例化的具体类。之前在.NET Core 3.1里的注册方式services.AddTransient<ServiceFactory, ServiceFactory>();本身就不符合MediatR的设计逻辑,只是碰巧没触发错误,迁移到.NET 6后DI容器的验证更严格,就暴露了问题。
正确的处理方式分两种情况:
情况1:无需自定义ServiceFactory
MediatR的官方扩展方法AddMediatR会自动完成ServiceFactory的注册,根本不需要手动添加那行代码。直接移除原来的注册代码,改用官方方式注册MediatR即可:
// 在.NET 6的Program.cs中 var builder = WebApplication.CreateBuilder(args); // 注册MediatR,自动包含ServiceFactory的正确实现 builder.Services.AddMediatR(config => config.RegisterServicesFromAssemblyContaining<YourRequestHandler>()); // 替换YourRequestHandler为你项目中任意一个MediatR处理器类,用于定位程序集 var app = builder.Build(); // 后续中间件配置...
情况2:需要自定义ServiceFactory逻辑
如果确实需要自定义服务创建逻辑(比如添加日志、特殊类型处理),要注册的是委托的实现,而非直接注册ServiceFactory类型:
services.AddTransient<ServiceFactory>(serviceProvider => serviceType => { // 这里写你的自定义逻辑,比如添加日志 // var logger = serviceProvider.GetRequiredService<ILogger<ServiceFactory>>(); // logger.LogInformation("Creating service for type {Type}", serviceType.Name); // 最终返回服务实例,默认用DI容器的GetRequiredService return serviceProvider.GetRequiredService(serviceType); });
内容的提问来源于stack exchange,提问作者fereshteh rabet
相关产品推荐
相关产品推荐

