我在 ASP.NET Core 7 Web API 中使用 Dapper。
我有很多类似这样的功能:
public async Task<int> InsertTableObject(TableObject tableObject)
{
using var connection = new SqlConnection(Configuration.GetConnectionString("MyDB"));
var result = await connection.ExecuteAsync(
"INSERT INTO [table_object] (name, create_at) VALUES (@Name, @CreateAt)",
tableObject);
return result;
}
每次打开新连接并传递连接字符串时:
Configuration.GetConnectionString("MyDB")
我想知道是否可以在
program.cs
中执行一次并在这些功能中使用连接?我不是故意那样做的:
private readonly IConfiguration _configuration;
public YourRepositoryClass(IConfiguration configuration)
{
_configuration = configuration;
}
private SqlConnection GetOpenConnection()
{
var connection = new SqlConnection(_configuration.GetConnectionString("MyDB"));
connection.Open();
return connection;
}
因为它只是包装 Dapper 连接(相反,我想配置为使用“MyDB”连接字符串),并且每次使用 Dapper SQL 类时,它都会从配置中读取。
可以这样做吗?比如:
// program.cs
...
Dapper.setConnectionString(Configuration["MyDB"]);
...
var app = builder.Build();
...
// foo.cs:
class Foo {
public async Task<int> InsertTableObject(TableObject tableObject)
{
using var connection = new SqlConnection(); // or without new? Dapper.Connection?
var result = await connection.ExecuteAsync(
"INSERT INTO [table_object] (name, create_at) VALUES (@Name, @CreateAt)",
tableObject);
return result;
}
}
你可以围绕 Dapper 创建包装器,如下所示:
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
using Dapper;
namespace MyApp.Services
{
public interface IDbService
{
Task<int> ExecuteAsync(string query, object parameters);
}
public class DbService : IDbService
{
private readonly IConfiguration _configuration;
public DbService(IConfiguration configuration)
{
_configuration = configuration;
}
private SqlConnection GetSqlConnection()
{
var connection = new SqlConnection(_configuration.GetConnectionString("MyDB"));
return connection;
}
public async Task<int> ExecuteAsync(string query, object parameters)
{
await using var connection = GetSqlConnection();
return await connection.ExecuteAsync(query, parameters).ConfigureAwait(false);
}
}
}
在DI注册:
builder.Services.AddScoped<IDbService,DbService>();
并按如下方式使用:
public class Foo
{
private readonly IDbService _dbService;
public Foo(IDbService dbService)
{
_dbService = dbService;
}
public async Task<int> InsertTableObject(TableObject tableObject)
{
return _dbService.ExecuteAsync(@"INSERT INTO [table_object] (name, create_at)
VALUES (@Name, @CreateAt)", tableObject);
}
}