Dapper 简洁的源代码-这会正确处理我的连接吗?

Dapper 简洁的源代码-这会正确处理我的连接吗?,dapper,using,Dapper,Using,查看Dappers QueryAsync方法的源代码 我的问题是,我的连接是否可以正确处理,而不必将调用此连接的代码包装到using块中?请注意您发布的代码中的以下行: private static async Task<IEnumerable<T>> QueryAsync<T>(this IDbConnection cnn,.... 如果Dapper打开了连接,Dapper将在wasClosed变量中维护状态/标志。您可以在代码中看到,连接在最后也正确地

查看Dappers QueryAsync方法的源代码


我的问题是,我的连接是否可以正确处理,而不必将调用此连接的代码包装到using块中?

请注意您发布的代码中的以下行:

private static async Task<IEnumerable<T>> QueryAsync<T>(this IDbConnection cnn,....
如果Dapper打开了连接,Dapper将在
wasClosed
变量中维护状态/标志。您可以在代码中看到,连接在最后也正确地关闭了。此外,您还可以进一步检查简洁的源代码,以了解如何在多个方法中处理此问题。特别检查
SqlMapper.Async.cs
SqlMapper.cs
文件

现在,这都是关于打开/关闭的。如何处置?以下是Marc Gravell在其中一篇文章中对此答案的回答:

好吧,从技术上讲,开放/关闭与处置是不同的。如果你只想打开/关闭单独的电话,你最好让dapper来做如果以更大的粒度(例如,每个请求)打开/关闭,那么代码最好这样做,并将打开的连接传递给dapper。

因此,如果您真的想
处理连接,而不是仅仅打开/关闭连接,最好在代码中使用
块将其包装在
中,并将打开的连接传递给Dapper。如评论中所述,帖子讨论了
Dispose
Close

之间的区别,请参阅和讨论StackOverflow。
using (var cmd = command.TrySetupAsyncCommand(cnn, info.ParamReader))
private static async Task<IEnumerable<T>> QueryAsync<T>(this IDbConnection cnn,....
if (wasClosed) await cnn.TryOpenAsync(cancel).ConfigureAwait(false);
....
if (wasClosed) cnn.Close();