ASP.NET Core依赖注入注册IRegistrationRepository无法解析System.String报错
错误原因
- 你在Startup类中通过
services.AddScoped<IRegistrationRepository, RegistrationRepository>()注册了仓储服务的自动依赖注入,但RegistrationRepository的构造函数需要接收string类型的数据库连接串作为第一个参数,.NET Core的依赖注入容器没有预先注册System.String类型的服务,无法自动提供该参数,因此抛出无法解析服务的错误。 - 另外你当前在控制器的构造函数中已经手动
new RegistrationRepository()完成了仓储实例化,完全不需要再通过DI容器注册该仓储服务,两者用法冲突也是错误的诱因。
解决方案
方案1:保留手动实例化逻辑(快速生效)
直接删除Startup类中services.AddScoped<IRegistrationRepository, RegistrationRepository>();这行注册代码即可,DI容器不需要再负责创建仓储实例,错误就会消失。
方案2:改为规范的依赖注入模式(推荐,后续维护性更强)
- 首先调整Startup类中的服务注册逻辑:
// 先注册InfoLogger,可根据需求选择生命周期,此处用Scoped举例 services.AddScoped<InfoLogger>(); // 替换原有仓储注册代码,用工厂方法显式提供构造函数需要的所有参数 services.AddScoped<IRegistrationRepository>(sp => { var config = sp.GetRequiredService<IConfiguration>(); var host = sp.GetRequiredService<IWebHostEnvironment>(); var logger = sp.GetRequiredService<InfoLogger>(); string connStr = config.GetConnectionString("DefaultConnection"); return new RegistrationRepository(connStr, host, logger); }); // 放开此前注释的RegistrationContext注册代码,避免控制器注入RegistrationContext时报错 services.AddEntityFrameworkNpgsql().AddDbContext<RegistrationContext>(options => options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection")));
- 修改控制器构造函数,删除手动实例化代码,直接通过参数注入依赖:
public RegistrationController(RegistrationContext context, IConfiguration Configure, IWebHostEnvironment host1, IRegistrationRepository regRepository, InfoLogger logger) { _objInfoLogger = logger; regContext = context; Configuration = Configure; this.whost = host1; iregrepository = regRepository; }
内容的提问来源于stack exchange,提问作者match
相关产品推荐
相关产品推荐

