如何在Dapper中全局设置命令超时时间
在Dapper中全局设置命令超时时间(ASP.NET Core 5 MVC)
Dapper本身没有提供直接的全局命令超时配置项,但你可以通过封装扩展方法或统一生成CommandDefinition的方式,一次性给所有查询设置默认超时,避免逐个修改100个仓储类的重复劳动。
方案一:封装自定义Dapper扩展方法
创建一个静态扩展类,封装Dapper常用的查询/执行方法,在内部统一指定commandTimeout参数。后续所有仓储类都使用这些自定义方法,而非Dapper原生方法。
using System.Data; using Dapper; public static class DapperGlobalTimeoutExtensions { // 全局默认超时时间(可根据需求调整) private const int DefaultCommandTimeout = 30; // 封装Query方法 public static IEnumerable<T> Query<T>(this IDbConnection connection, string sql, object param = null, IDbTransaction transaction = null, bool buffered = true) { return connection.Query<T>(sql, param, transaction, buffered, commandTimeout: DefaultCommandTimeout); } // 封装QueryFirstOrDefault方法 public static T QueryFirstOrDefault<T>(this IDbConnection connection, string sql, object param = null, IDbTransaction transaction = null) { return connection.QueryFirstOrDefault<T>(sql, param, transaction, commandTimeout: DefaultCommandTimeout); } // 封装Execute方法 public static int Execute(this IDbConnection connection, string sql, object param = null, IDbTransaction transaction = null) { return connection.Execute(sql, param, transaction, commandTimeout: DefaultCommandTimeout); } // 根据项目需求,继续封装其他需要的Dapper方法(如QuerySingle、ExecuteScalar等) }
使用方式
在仓储类中引用该扩展类的命名空间,替换原有的Dapper调用:
// 原来的写法(需要手动指定超时) // var users = _connection.Query<User>("SELECT * FROM Users", commandTimeout: 30); // 现在的写法(自动使用全局超时) var users = _connection.Query<User>("SELECT * FROM Users");
后续如果需要调整超时时间,只需修改DefaultCommandTimeout常量即可,无需改动所有仓储类。
方案二:统一生成CommandDefinition
Dapper的多数方法支持传入CommandDefinition对象,你可以创建一个工厂类,统一生成带默认超时的CommandDefinition。
using System.Data; using Dapper; public static class CommandDefinitionFactory { private const int DefaultCommandTimeout = 30; public static CommandDefinition Create(string sql, object param = null, IDbTransaction transaction = null, CommandType? commandType = null) { return new CommandDefinition( sql: sql, parameters: param, transaction: transaction, commandTimeout: DefaultCommandTimeout, commandType: commandType ); } }
使用方式
在仓储类中通过工厂类生成CommandDefinition,再传给Dapper方法:
var command = CommandDefinitionFactory.Create("SELECT * FROM Users WHERE Id = @Id", new { Id = 1 }); var user = _connection.QueryFirstOrDefault<User>(command);
这种方式适合已经习惯使用CommandDefinition的场景,同样能实现全局超时的统一管理。
内容的提问来源于stack exchange,提问作者Nabeel
相关产品推荐
相关产品推荐

