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