使用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

