ASP.NET Core集成MediatR时IServiceProvider.GetService泛型调用报错如何解决?
错误原因
- 核心原因是代码未引入
Microsoft.Extensions.DependencyInjection命名空间:泛型方法GetService<T>()不属于IServiceProvider接口的原生定义,是该命名空间下提供的扩展方法。缺少命名空间引用时,编译器只能识别原生非泛型方法GetService(Type),因此会触发类型参数不支持的报错。 - 次要排查项:需确认你已在服务注册文件中正确添加MediatR的服务注册逻辑,避免解决当前问题后出现服务未找到的后续报错。
解决方案
方案1(推荐):补充命名空间引用
在基础控制器代码的头部添加如下引用即可直接使用原有泛型写法:
using Microsoft.Extensions.DependencyInjection;
方案2:使用原生非泛型方法做类型转换
如果不想额外引入命名空间,可以直接修改Mediator属性的赋值逻辑,调用原生非泛型方法后强制类型转换:
[ApiController] [Route("api/v{version:apiVersion}/[controller]")] public abstract class BaseApiController : ControllerBase { private IMediator _mediator; protected IMediator Mediator => _mediator ??= (IMediator)HttpContext.RequestServices.GetService(typeof(IMediator)); }
补充验证:确认MediatR服务注册
以.NET 6+的顶层语句Program.cs为例,需提前注册MediatR服务:
// 注册MediatR,扫描当前程序集的中介者处理类 builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(typeof(Program).Assembly));
内容的提问来源于stack exchange,提问作者Lanre Afeez
相关产品推荐
相关产品推荐

