如何在ASP.NET Core 7 Web API中全局配置Dapper连接字符串?
首先明确:Dapper本身没有全局配置连接字符串的功能,它只是对IDbConnection的扩展方法,所以需要结合ASP.NET Core的依赖注入(DI)来实现你的需求,以下是两种优雅的方案:
方案一:通过DI注册
IDbConnection实例 直接在Program.cs中配置SqlConnection的实例化逻辑,后续在业务类中注入IDbConnection即可使用:
- 在
Program.cs中添加注册代码:
var builder = WebApplication.CreateBuilder(args); // 注册IDbConnection,每次获取都是新的SqlConnection实例,自动带入连接字符串 builder.Services.AddTransient<IDbConnection>(sp => new SqlConnection(builder.Configuration.GetConnectionString("MyDB"))); // 其他服务注册... var app = builder.Build(); // ...
- 在业务类中注入并使用:
class Foo { private readonly IDbConnection _dbConnection; // 通过构造函数注入IDbConnection public Foo(IDbConnection dbConnection) { _dbConnection = dbConnection; } public async Task<int> InsertTableObject(TableObject tableObject) { using var connection = _dbConnection; return await connection.ExecuteAsync( "INSERT INTO [table_object] (name, create_at) VALUES (@Name, @CreateAt)", tableObject); } }
方案二:注册连接工厂(更灵活)
如果需要更灵活地控制连接创建时机,可注册Func<SqlConnection>工厂:
- 在
Program.cs中注册工厂:
var builder = WebApplication.CreateBuilder(args); var connectionString = builder.Configuration.GetConnectionString("MyDB"); // 注册连接工厂,每次调用都会生成新的SqlConnection实例 builder.Services.AddTransient<Func<SqlConnection>>(() => () => new SqlConnection(connectionString)); // 其他配置...
- 在业务类中使用工厂:
class Foo { private readonly Func<SqlConnection> _connectionFactory; public Foo(Func<SqlConnection> connectionFactory) { _connectionFactory = connectionFactory; } public async Task<int> InsertTableObject(TableObject tableObject) { using var connection = _connectionFactory(); return await connection.ExecuteAsync( "INSERT INTO [table_object] (name, create_at) VALUES (@Name, @CreateAt)", tableObject); } }
方案三:自定义SqlConnection子类(可选)
如果偏好直接实例化连接类的方式,可以自定义一个继承SqlConnection的类,在构造函数中自动读取连接字符串:
- 创建自定义连接类:
public class AppSqlConnection : SqlConnection { public AppSqlConnection(IConfiguration configuration) : base(configuration.GetConnectionString("MyDB")) { } }
- 在
Program.cs注册:
builder.Services.AddTransient<AppSqlConnection>();
- 在业务类中注入使用:
class Foo { private readonly AppSqlConnection _connection; public Foo(AppSqlConnection connection) { _connection = connection; } public async Task<int> InsertTableObject(TableObject tableObject) { using var connection = _connection; return await connection.ExecuteAsync( "INSERT INTO [table_object] (name, create_at) VALUES (@Name, @CreateAt)", tableObject); } }
以上方案都避免了在每个业务方法中重复书写连接字符串的逻辑,完全符合ASP.NET Core的设计规范,同时满足你"一次性配置,直接使用连接"的需求。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

