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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:35:26