ASP.NET Core注入IDBConnection时提示无法解析服务报错如何解决
问题原因
- 未在依赖注入容器中注册
IDBConnection接口对应的实现类。ASP.NET Core内置依赖注入容器需要提前知晓接口和实现类的映射关系,才能在控制器实例化时自动注入对应的实例,你没有注册该服务,所以容器无法解析IDBConnection类型的服务导致报错。 - 控制器定义了多个独立构造函数,不符合依赖注入的最佳实践。当前你分别写了仅注入
DataContext和仅注入IDBConnection的构造函数,容器在实例化控制器时只会选择匹配参数最多的一个构造函数,就算后续注册了IDBConnection,也会导致其中一个依赖字段为空,运行时触发空引用异常。
解决步骤
- 合并控制器构造函数,将所有需要注入的依赖放到同一个构造方法中:
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; } }
- 在
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
相关产品推荐
相关产品推荐

