构建.NET API时依赖注入无法解析IDbConnection致服务无法构造
问题排查与解决方案
1. 确认IDbConnection的接口映射注册
你可能只注册了SqlConnection具体类型,但仓储依赖的是IDbConnection接口,DI容器无法自动将具体类型关联到接口。需要显式注册接口到实现的映射:
// 先注册SqlConnection具体实例 services.AddScoped<SqlConnection>(sp => new SqlConnection(Configuration.GetConnectionString("YourConnectionString"))); // 再将IDbConnection映射到已注册的SqlConnection services.AddScoped<IDbConnection>(sp => sp.GetRequiredService<SqlConnection>());
2. 验证仓储类的构造函数依赖
确保EmployeesRepository等仓储的构造函数正确依赖IDbConnection,而非具体的SqlConnection或其他未注册类型:
public class EmployeesRepository : RepositoryBase<Employees>, IEmployeesRepository { // 构造函数必须依赖IDbConnection public EmployeesRepository(IDbConnection connection) : base(connection) { } // 其他仓储方法... }
3. 检查IDbTransaction的注册逻辑
如果IDbTransaction的注册依赖IDbConnection,需确保逻辑正确且IDbConnection已提前注册。错误的事务注册会导致连锁的依赖解析失败:
services.AddScoped<IDbTransaction>(sp => { var connection = sp.GetRequiredService<IDbConnection>(); if (connection.State != ConnectionState.Open) connection.Open(); return connection.BeginTransaction(); });
4. 调整DI注册顺序
必须先注册IDbConnection/SqlConnection,再注册仓储服务。DI容器解析服务时会按注册顺序查找依赖,若仓储注册在前,容器无法找到后续注册的连接服务:
// 正确顺序:先注册连接和事务 services.AddScoped<SqlConnection>(...); services.AddScoped<IDbConnection>(...); services.AddScoped<IDbTransaction>(...); // 再注册仓储服务 services.AddScoped<IEmployeesRepository, EmployeesRepository>(); services.AddScoped<IRoleRepository, RoleRepository>(); services.AddScoped<IHasRoleRepository, HasRoleRepository>();
5. 排查作用域冲突
确保所有相关服务(连接、事务、仓储)都注册为Scoped,避免混合Singleton和Scoped依赖。如果存在Singleton服务依赖Scoped的连接/仓储,会触发作用域解析错误。
内容的提问来源于stack exchange,提问作者Tkach Yevhenii
相关产品推荐
相关产品推荐

