मैं सीख रहा हूं कि कैसे डैपर दृश्यों के पीछे काम कर रहा है।डैपर का घोंसला 'उपयोग' खंड - स्पष्टीकरण?
हालांकि मैंने निपटान के इस पैटर्न को देखा जो मुझे समझ में नहीं आया है। , कि है, क्योंकि वह करना चाहता था सशर्त के माध्यम से कनेक्शन बंद
/*1*/ public async Task<IEnumerable<T>> QueryAsync<T>(string sql, Func<IDataRecord, T> projector, DbConnection _conn, dynamic param = null)
/*2*/ {
/*3*/
/*4*/ DbDataReader reader = null;
/*5*/ bool wasClosed = _conn.State == ConnectionState.Closed;
/*6*/ try
/*7*/ {
/*8*/
/*9*/ using (var cmd = _conn.CreateCommand())
/*10*/ {
/*11*/ if (param!=null)
/*12*/ foreach (var prop in param.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
/*13*/ {
/*14*/ var parameter = cmd.CreateParameter();
/*15*/ parameter.ParameterName = prop.Name;
/*16*/ parameter.Value = prop.GetValue(param, null);
/*17*/ cmd.Parameters.Add(parameter);
/*18*/ }
/*19*/
/*20*/ await _conn.OpenAsync().ConfigureAwait(false);
/*21*/ cmd.CommandTimeout = 100000;
/*22*/ cmd.CommandText = sql;
/*23*/ reader = await cmd.ExecuteReaderAsync().ConfigureAwait(false);
/*24*/ List<T> buffer = new List<T>();
/*25*/ while (await reader.ReadAsync().ConfigureAwait(false)) buffer.Add(projector(reader));
/*26*/ return buffer;
/*27*/ }
/*28*/
/*29*/ }
/*30*/ finally
/*31*/ {
/*32*/ using (reader) { }
/*33*/ if (wasClosed) _conn.Close();
/*34*/ }
/*35*/ }
मैं समझ सकता क्यों वह कनेक्शन पर using
का उपयोग नहीं किया: -
मोटे तौर पर सामान्य रूप मेंthis कैसे QueryAsync
कार्यान्वित किया जाता है है wasClosed चर।
ऐसा करने के लिए - उसे try/finally
खंड का उपयोग करना होगा। (इसलिए सशर्त समापन finally
खंड में होगा)
लेकिन मेरा प्रश्न पंक्ति # 32 के बारे में है।
इसके बजाय using at the finally clause करने का है, वह कर सकता है:
using (DbDataReader reader = await cmd.ExecuteReaderAsync().ConfigureAwait(false))
{
List<T> buffer = new List<T>();
while (await reader.ReadAsync().ConfigureAwait(false)) buffer.Add(projector(reader));
return buffer;
}
तो finally
खंड के साथ छोड़ दिया है:
finally
{
//using (reader) { } //removed
if (wasClosed) _conn.Close();
}
प्रश्न
मैं इस using
खंड देखा है आखिरकार डैपर में कई बार खंड।
मुझे यहां कुछ याद आना चाहिए, लेकिन यह पैटर्न क्या प्राप्त करता है कि मेरा सुझाव नहीं है?
यह एक दोष की तरह दिखता है। आपका प्रस्ताव बेहतर है। शायद इसके लिए कोई अच्छा कारण नहीं है। – usr