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

使用Mediator源生成器注册时遇AddMediator调用歧义问题求助

解决Mediator源生成器AddMediator方法调用歧义问题

问题背景

我使用.NET的Mediator源生成器实现中介者模式,已安装Mediator.SourceGenerator 2.0.x和Mediator.Abstractions 2.0.x包,注册代码如下:

var builder = WebApplication.CreateBuilder(args);
    
//DI
builder.Services.AddScoped<IRepository, Repository>();
builder.Services.AddScoped<IDocumentService, DocumentService>();
builder.Services.AddScoped<ICacheService, CacheService>();

builder.Services.AddScoped<IValidationService, ValidationService>();

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

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Services.AddMediator(options =>
{
    options.ServiceLifetime = ServiceLifetime.Transient;
});

编译错误

源生成器已成功生成文件,但编译时出现以下歧义错误:

Error CS0121: The call is ambiguous between the following methods or properties: 'Microsoft.Extensions.DependencyInjection.MediatorDependencyInjectionExtensions.AddMediator(Microsoft.Extensions.DependencyInjection.IServiceCollection, System.Action<Mediator.MediatorOptions>)' and 'Microsoft.Extensions.DependencyInjection.MediatorDependencyInjectionExtensions.AddMediator(Microsoft.Extensions.DependencyInjection.IServiceCollection, System.Action<Mediator.MediatorOptions>)'

已尝试的无效操作

  • 安装/移除Microsoft.Extensions.DependencyInjection包后重新编译
  • 尝试使用全限定名调用方法:
builder.Services.Microsoft.Extensions.DependencyInjection.MediatorDependencyInjectionExtensions.AddMediator(options =>
{
    options.ServiceLifetime = ServiceLifetime.Transient;
});
  • 重启Visual Studio

解决方案

这种歧义由重复引入相同扩展方法导致,以下是针对性解决办法:

1. 清理重复包引用

打开项目文件(.csproj),检查是否同时引用了Mediator包与Mediator.SourceGenerator/Mediator.Abstractions包。2.0.x版本的源生成器模式下,仅需引用Mediator.SourceGenerator即可,它会自动引入必要依赖,单独引用Mediator.Abstractions可能导致重复类型冲突。移除多余引用后,清理项目的bin/obj目录,重新生成。

2. 排除重复生成的文件

若项目中存在多个程序集包含相同的AddMediator扩展方法,可在项目文件中添加排除规则,避免加载重复类型:

<ItemGroup>
  <Compile Remove="**/MediatorDependencyInjectionExtensions.cs" />
</ItemGroup>

注意:仅确认存在重复生成文件时使用,避免误删必要的源生成代码。

3. 显式指定方法的程序集

使用global::前缀结合程序集限定名,强制编译器选择指定程序集中的方法:

global::Microsoft.Extensions.DependencyInjection.MediatorDependencyInjectionExtensions.AddMediator(
    builder.Services, 
    options => options.ServiceLifetime = ServiceLifetime.Transient
);

4. 更新到最新稳定版

将Mediator.SourceGenerator更新至最新的2.0.x稳定版本,部分旧版本存在源生成器重复生成扩展方法的BUG。

内容的提问来源于stack exchange,提问作者Vladimir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:09:55