.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
相关产品推荐
相关产品推荐

