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

ASP.NET Core注入IDBConnection时提示无法解析服务报错如何解决

问题原因
  • 未在依赖注入容器中注册IDBConnection接口对应的实现类。ASP.NET Core内置依赖注入容器需要提前知晓接口和实现类的映射关系,才能在控制器实例化时自动注入对应的实例,你没有注册该服务,所以容器无法解析IDBConnection类型的服务导致报错。
  • 控制器定义了多个独立构造函数,不符合依赖注入的最佳实践。当前你分别写了仅注入DataContext和仅注入IDBConnection的构造函数,容器在实例化控制器时只会选择匹配参数最多的一个构造函数,就算后续注册了IDBConnection,也会导致其中一个依赖字段为空,运行时触发空引用异常。
解决步骤
  1. 合并控制器构造函数,将所有需要注入的依赖放到同一个构造方法中:
public class UsersController : ControllerBase
{
    private readonly IDBConnection _isqlConnection;
    private readonly DataContext _context;
    // 合并为一个构造函数,同时接收两个依赖参数
    public UsersController(DataContext context, IDBConnection connection)
    {         
        _context = context;
        _isqlConnection = connection;
    }

    // 其余代码保持不变
    [HttpGet]
    public ActionResult<IEnumerable<AppUser>>GetUsers()
    {
        _isqlConnection.GetConnection().Open();
        var user = _context.Users.ToList();
        _isqlConnection.GetConnection().Close();
        return user;
    }
}
  1. 在Startup.cs的ConfigureServices方法中添加IDBConnection的服务注册:
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<DataContext>(options =>
    {
        options.UseSqlServer(_config.GetConnectionString("DefaultConnection"));
    });
    // 新增IDBConnection服务注册,这里用Scoped生命周期,也可根据需求选Singleton/Transient
    services.AddScoped<IDBConnection, DBConnection>();
    
    services.AddHttpContextAccessor();
    services.AddControllers();
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "API", Version = "v1" });
    });
}
可选优化建议
  • 不要在DBConnection类中硬编码连接字符串,可以直接读取配置文件中的连接字符串,和DataContext共用同一份配置,避免后续修改连接字符串时需要改多处:
public class DBConnection : IDBConnection
{
    private readonly SqlConnection _con;
    // 注入IConfiguration读取配置
    public DBConnection(IConfiguration config)
    {
        _con = new SqlConnection(config.GetConnectionString("DefaultConnection"));
    }
    public SqlConnection GetConnection()
    {
        return _con;
    }
}
  • SqlConnection实现了IDisposable接口,建议配合using语句使用,自动释放连接资源,不用手动调用Open/Close方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:27:03