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

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:改为规范的依赖注入模式(推荐,后续维护性更强)

  1. 首先调整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")));
  1. 修改控制器构造函数,删除手动实例化代码,直接通过参数注入依赖:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:48:04