我的项目中有一个情况需要使用 Dapper 的多个数据库连接。
我创建了一个带有构造函数的抽象类来传递连接 这是例子
public abstract class BaseRepository
{
private readonly IDbConnection _dbConnection;
public BaseRepository(IDbConnection dbConnection)
{
_dbConnection = dbConnection;
}
public async Task<int> ExecuteAsync(string sql, object? param = null,
IDbTransaction?
transaction = null, int? commandTimeout = null, CommandType?
commandType = null)
{
try
{
return await _dbConnection.ExecuteAsync(sql, param, transaction,
commandTimeout, commandType)
.ConfigureAwait(false);
}
catch (Exception ex)
{
// Log the exception, rethrow it, or handle it in some other way
throw new Exception("An error occurred while retrieving the company.", ex);
}
}
}
并像这样在其他类中继承
public class PRepository:BaseRepository
{
public PRepository([FromKeyedServices(DbConnectionKeys.PCMRead)] IDbConnection
_connectionP,
) : base(_connectionP)
{
}
}
我只是想知道这是正确的方法吗?还是任何其他方法可以在没有抽象的情况下实现相同的目的。
提前致谢
看看这是否有帮助。我在我的 WebAPI 项目中创建了一个名为
DapperContext.cs
的文件。就我而言,即使我也必须访问多个数据库。这是我在里面所做的DapperContext.cs
:
public class DapperContext
{
private readonly string _databaseConnectionString1;
private readonly string _databaseConnectionString2;
public DapperContext(string databaseConnectionString1,string databaseConnectionString2)
{
_databaseConnectionString1= databaseConnectionString1;
_databaseConnectionString2= databaseConnectionString2;
}
public IDbConnection CreateConnection() => new SqlConnection(_databaseConnectionString1);
public IDbConnection CreateLogConnection() => new SqlConnection(_databaseConnectionString2);
}
然后在
Program.cs
内部,读取appsettings.json
中的连接字符串:
var db1string = builder.Configuration.GetConnectionString("db1string");
var db2string = builder.Configuration.GetConnectionString("db2string");
最后在您的代码中,根据您的情况,您可以像这样处理它:
using (var connection = _context.CreateConnection()) // Or _context.CreateLogConnection
{
}