ASP.NET Core 6中IRequestHandler注入失败:服务无法构造求助
解决ASP.NET Core 6中注入IRequestHandler时无法解析IDbConnection的问题
问题根源
激活TabpediaFin.Handler.UnitMeasures.UnitMeasureList+QueryHandler时,依赖注入(DI)容器中未注册System.Data.IDbConnection类型的服务,导致依赖链无法完整构建,进而抛出System.AggregateException。
解决步骤
1. 确认DbManager的IDbConnection创建逻辑
检查DbManager.cs,确保它能基于配置的连接字符串正确实例化IDbConnection(示例以SqlServer为例,可根据实际数据库替换对应Connection类):
public class DbManager { private readonly string _connectionString; public DbManager(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("DefaultConnection"); } public IDbConnection GetConnection() { var connection = new SqlConnection(_connectionString); connection.Open(); return connection; } }
2. 在Program.cs中注册IDbConnection服务
在DI容器中注册IDbConnection,推荐使用AddScoped(保证每个请求生命周期内仅实例化一次):
var builder = WebApplication.CreateBuilder(args); // 注册DbManager builder.Services.AddScoped<DbManager>(); // 注册IDbConnection,通过DbManager获取实例 builder.Services.AddScoped<IDbConnection>(sp => { var dbManager = sp.GetRequiredService<DbManager>(); return dbManager.GetConnection(); }); // 注册MediatR处理器(确保扫描包含QueryHandler的程序集) builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblyContaining<UnitMeasureList.QueryHandler>()); // 其他服务注册逻辑... var app = builder.Build(); // 后续管道配置...
3. 验证QueryHandler的构造函数依赖
检查UnitMeasureList.cs中的QueryHandler,确保构造函数仅依赖已注册的服务:
public class UnitMeasureList { public record Query : IRequest<List<UnitMeasureDto>>; public class QueryHandler : IRequestHandler<Query, List<UnitMeasureDto>> { private readonly IDbConnection _dbConnection; public QueryHandler(IDbConnection dbConnection) { _dbConnection = dbConnection; } public async Task<List<UnitMeasureDto>> Handle(Query request, CancellationToken cancellationToken) { // 业务逻辑:使用_dbConnection执行数据库查询 // ... } } }
4. 确认连接字符串配置
保证appsettings.json中存在正确的数据库连接字符串:
{ "ConnectionStrings": { "DefaultConnection": "Server=.;Database=TabpediaFin;Trusted_Connection=True;TrustServerCertificate=True;" } }
额外注意事项
- 使用MediatR时,必须通过
AddMediatR正确扫描包含请求处理器的程序集,否则DI容器无法发现QueryHandler。 - 避免将
IDbConnection注册为AddSingleton,会引发数据库连接池复用问题,优先选择AddScoped或AddTransient。
内容的提问来源于stack exchange,提问作者reza irawan
相关产品推荐
相关产品推荐

