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

.NET6 Blazor Server中如何在DI容器注册多个IDbConnection实例

解决.NET6 Blazor Server中注册多个IDbConnection实例的问题

下面提供三种实用方案,按需选择:

方案一:使用.NET 6+的键控服务(Keyed Services)

.NET 6及以上原生支持键控服务,可以给不同的IDbConnection实例指定唯一标识,注入时通过标识区分。

1. 注册键控服务

在Program.cs中添加:

// 注册第一个数据库连接,标识为"MainDb"
builder.Services.AddKeyedTransient<IDbConnection, SqlConnection>("MainDb", (sp, key) => 
    new SqlConnection(config.GetConnectionString("MyConnection")));

// 注册第二个数据库连接,标识为"SecondaryDb"
builder.Services.AddKeyedTransient<IDbConnection, SqlConnection>("SecondaryDb", (sp, key) => 
    new SqlConnection(config.GetConnectionString("AnotherConnection")));

2. 在服务中注入指定连接

在需要使用的仓储类中,通过[FromKeyedServices]特性指定要注入的键:

private readonly IDbConnection _mainDbCon;
private readonly IDbConnection _secondaryDbCon;

public MyRepository(
    [FromKeyedServices("MainDb")] IDbConnection mainDbCon,
    [FromKeyedServices("SecondaryDb")] IDbConnection secondaryDbCon)
{
    _mainDbCon = mainDbCon;
    _secondaryDbCon = secondaryDbCon;
}

// 使用示例
public string GetMainDbData(int id)
{
    var parameters = new DynamicParameters();
    parameters.Add("MyId", id);
    return _mainDbCon.QuerySingle<string>("GetMainData", parameters, commandType: CommandType.StoredProcedure);
}

方案二:创建专属连接包装类

通过定义不同的包装类来区分连接,避免依赖冲突。

1. 定义包装类

创建两个空类继承SqlConnection:

public class MainDbConnection : SqlConnection
{
    public MainDbConnection(string connectionString) : base(connectionString) { }
}

public class SecondaryDbConnection : SqlConnection
{
    public SecondaryDbConnection(string connectionString) : base(connectionString) { }
}

2. 注册包装类服务

在Program.cs中注册这两个包装类:

builder.Services.AddTransient<MainDbConnection>(sp => 
    new MainDbConnection(config.GetConnectionString("MyConnection")));

builder.Services.AddTransient<SecondaryDbConnection>(sp => 
    new SecondaryDbConnection(config.GetConnectionString("AnotherConnection")));

3. 在服务中注入

直接注入对应的包装类即可:

private readonly MainDbConnection _mainDbCon;
private readonly SecondaryDbConnection _secondaryDbCon;

public MyRepository(MainDbConnection mainDbCon, SecondaryDbConnection secondaryDbCon)
{
    _mainDbCon = mainDbCon;
    _secondaryDbCon = secondaryDbCon;
}

方案三:自定义连接工厂

创建一个工厂类,统一管理不同的数据库连接,按需获取。

1. 定义工厂接口和实现

public interface IDbConnectionFactory
{
    IDbConnection GetConnection(string connectionName);
}

public class DbConnectionFactory : IDbConnectionFactory
{
    private readonly IConfiguration _config;

    public DbConnectionFactory(IConfiguration config)
    {
        _config = config;
    }

    public IDbConnection GetConnection(string connectionName)
    {
        var connectionString = _config.GetConnectionString(connectionName);
        return new SqlConnection(connectionString);
    }
}

2. 注册工厂服务

在Program.cs中注册工厂:

builder.Services.AddTransient<IDbConnectionFactory, DbConnectionFactory>();

3. 在服务中使用工厂

注入工厂后,根据名称获取对应的连接:

private readonly IDbConnectionFactory _connectionFactory;

public MyRepository(IDbConnectionFactory connectionFactory)
{
    _connectionFactory = connectionFactory;
}

public string GetSecondaryDbData(int id)
{
    using var connection = _connectionFactory.GetConnection("AnotherConnection");
    var parameters = new DynamicParameters();
    parameters.Add("MyId", id);
    return connection.QuerySingle<string>("GetSecondaryData", parameters, commandType: CommandType.StoredProcedure);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:58:12