Dapper が DB 接続を処理する方法と、DB 接続が適切に破棄されない理由を理解する助けが必要です。考えられるさまざまなケースをコーディングしました。私のコードでは、_connection が null かどうかを確認し、それに応じて新しい接続を作成しています。リクエストを進めると、接続が開いたままになっている場合があり、オブジェクトに接続文字列が欠落している場合があります(使用できなくなりますが、NULL に設定されません)。私はこれらのケースをそれに応じて処理していますが、クライアント コードが明示的にusing を実装しているにもかかわらず、接続がこれらのさまざまな状態を持ち、破棄されない理由を理解したいと思います。コードをラップするステートメント。それはADO.netの接続の処理ですか、Dapperの副作用ですか、それとも私のコードの問題ですか?
接続管理コード
public class DatabaseContext : IDatabaseContext
{
private readonly string _connectionString;
private DbConnection _connection;
public DatabaseContext(string connectionString)
{
_connectionString = connectionString;
}
public IDbConnection Connection
{
get
{
if (_connection == null)
_connection = new SqlConnection(_connectionString);
if (string.IsNullOrEmpty(_connection.ConnectionString))
_connection.ConnectionString = _connectionString;
if (_connection.State != ConnectionState.Open)
_connection.Open();
return _connection;
}
}
}
クライアントコード
public IEnumerable<PostSearResults> Search(SearchPostsBy searchPostsBy)
{
DynamicParameters param;
var sql = GetSearchSql(searchPostsBy,out param);//Gets SQL
using (var connection = _databaseContext.Connection)
{
var posts = connection.Query<PostSearResults>(sql, param);
return posts.ToList();
}
}