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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:25:58