请注意您发布的代码中的以下行:
private static async Task<IEnumerable<T>> QueryAsync<T>(this IDbConnection cnn,....
这表明QueryAsync
是一个扩展方法IDbConnection
。这意味着,连接实例在您的代码中创建某处。
如上所述here,有两种方法可以管理与 Dapper 的连接:
考虑到这一点,这里唯一的选择是在代码中打开/关闭连接或允许 Dapper 为您执行此操作。如果您自己这样做,那么 Dapper 根本不会干涉。
如果您想让 Dapper 为您处理打开/关闭连接,并且担心它是否会正确关闭它,那么是的,它会正确关闭它。
在您的帖子中找到以下代码:
if (wasClosed) await cnn.TryOpenAsync(cancel).ConfigureAwait(false);
....
if (wasClosed) cnn.Close();
Dapper 维护状态/标志wasClosed
如果连接是由 Dapper 打开的,则为变量。您可以在代码中看到连接最后也正确关闭。此外,您可以进一步查看Dapper源代码,了解多种方法中如何处理this。特别检查SqlMapper.Async.cs
and SqlMapper.cs
files.
现在,这都是关于打开/关闭的。关于什么Dispose
?以下是马克·格拉维尔 (Marc Gravell) 在其中一篇文章中所说的话:comment对于这个答案:https://stackoverflow.com/a/12629170/5779732
嗯,从技术上讲,打开/关闭与处置不同。如果您只想在各个调用周围打开/关闭,那么您不妨让 dapper 来完成。如果您以更广泛的粒度(例如,每个请求)打开/关闭,那么您的代码最好执行此操作并将打开的连接传递给 dapper。
所以,如果你真的想Dispose
连接而不是仅仅打开/关闭,最好将其包裹起来using
阻止您的代码并将打开的连接传递给 Dapper。正如评论中提到的,this帖子讨论了之间的区别Dispose
and Close
.