Blazor Server(EF Core)使用DI与工厂模式连接数据库时出现CS0121方法歧义错误的解决方案咨询
你遇到的CS0121错误本质是方法签名冲突:EF Core官方的Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions类中已经定义了一个AddDbContextFactory扩展方法,而你自己在BlazorSv.Models.FactoryExtensions里写的同名方法,参数列表和返回值完全一致,编译器无法判断你要调用哪一个版本。
下面是几种可行的解决思路:
1. 明确指定调用的方法命名空间
直接在调用时写出方法的全限定命名空间,消除歧义:
- 如果要使用EF Core官方的工厂实现(推荐,因为官方已经做了完善的生命周期管理):
// 明确指定EF Core的扩展方法 Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.AddDbContextFactory<Models.SQLbeginnerContext>( services, options => options.UseNpgsql(Configuration.GetConnectionString("DBConnection")) );
- 如果坚持使用自己实现的工厂:
// 明确指定你自己的扩展方法 BlazorSv.Models.FactoryExtensions.AddDbContextFactory<Models.SQLbeginnerContext>( services, options => options.UseNpgsql(Configuration.GetConnectionString("DBConnection")) );
2. 修改自定义扩展方法的名称
把你自己的AddDbContextFactory改个独特的名字,比如AddCustomDbContextFactory,这样就不会和官方方法重名了:
在FactoryExtensions类中修改方法名:
public static IServiceCollection AddCustomDbContextFactory<TContext>( this IServiceCollection collection, Action<DbContextOptionsBuilder> optionsAction = null, ServiceLifetime contextAndOptionsLifetime = ServiceLifetime.Singleton) where TContext : DbContext { // 原方法逻辑不变 }
然后在Startup中调用修改后的方法:
services.AddCustomDbContextFactory<Models.SQLbeginnerContext>(options => options.UseNpgsql(Configuration.GetConnectionString("DBConnection")));
3. 删除自定义工厂代码,直接使用EF Core官方实现
其实EF Core已经内置了IDbContextFactory的实现,你自己写的工厂逻辑和官方提供的功能高度重合,完全可以删除以下代码:
IDbContextFactory<TContext>接口blazordbFactory<TContext>类FactoryExtensions类
直接使用官方的AddDbContextFactory即可,这样既减少了冗余代码,又避免了命名冲突。
补充说明
你之前尝试补充Models.SQLbeginnerContext的命名空间层级没用,是因为冲突的是扩展方法本身,而不是泛型参数的类型。只要Startup类的using语句同时包含了Microsoft.Extensions.DependencyInjection和BlazorSv.Models,编译器就会看到两个同名的扩展方法,从而报错。
内容的提问来源于stack exchange,提问作者BTOM

