Dapper를 사용하여 데이터베이스에 액세스 할 때마다 데이터베이스 연결이 열리고 닫히도록 보장

c# dapper database-connection sql sql-server

문제

다음은 현재 저장소 클래스 중 하나에서 수행중인 작업입니다.

private IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString);

public IEnumerable<Product> GetProducts(int categoryId = null, bool? active = null)
{
    StringBuilder sql = new StringBuilder();
    sql.AppendLine("SELECT * ");
    sql.AppendLine("FROM Product ");
    sql.AppendLine("WHERE @CategoryId IS NULL OR CategoryId = @CategoryId ");
    sql.AppendLine("  AND @Active IS NULL OR Active = @Active");

    return this.db.Query<Product>(sql.ToString(), new { CategoryId = categoryId, Active = active }).ToList();
}

한 가지해야 할 것은 다른 모든 repos가 상속받은 BaseRepository에 IDbConnection 속성을 넣는 것입니다. 위의 예제와 같이 각 데이터 액세스 함수에서 데이터베이스 연결이 제대로 열리고 닫히지 않도록하려면 어떻게해야합니까? 여기에 내가 현재 Entity Framework에서하는 작업이 있습니다 (각 함수 주위의 사용 문을 사용하지만 지금은 순수 Dapper를 사용하도록 DAL을 전환하고 있습니다 :

using (var context = new MyAppContext())
{
    var objList = (from p in context.Products
                   where (categoryId == null || p.CategoryId == categoryId) &&
                         (active == null || p.Active == active)
                   select p).ToList();

    return objList;
}

나는 Dapper 예제 에서 모든 것이 기대하는 것처럼 사용하는 문장에 싸여 있음을 알았지 만, 때로는 다음과 같이 함수를 래핑하는 것을 볼 수 있습니다.

using (var connection = Program.GetClosedConnection())

GetClosedConnection ()은 새로운 SqlConnection을 반환하지만이 둘의 차이점은 무엇입니까?

public static SqlConnection GetOpenConnection(bool mars = false)
{
    var cs = connectionString;
    if (mars)
    {
        SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder(cs);
        scsb.MultipleActiveResultSets = true;
        cs = scsb.ConnectionString;
    }
    var connection = new SqlConnection(cs);
    connection.Open();
    return connection;
}
public static SqlConnection GetClosedConnection()
{
    return new SqlConnection(connectionString);
}

수락 된 답변

여기 제가 어떻게 그 일을 항상했습니다 :

SqlConnection dbConnection;
using (dbConnection = new SqlConnection(connectionString))
{
    /* 
       Whatever Dapper stuff you want to do. Dapper will open the
       connection and the using will tear it down.
    */
}

질문의 두 번째 부분 인 GetClosedConnectionSqlConnection 개체를 인스턴스화하는 반면 GetOpenConnectionSqlConnection 개체를 인스턴스화 하고 엽니 다 . 사용자 (또는 Dapper)는 GetClosedConnection 의해 반환 된 개체에서 Open() 을 수동으로 호출해야합니다.


인기 답변

이 답변은 "반복 회피"를 바라는 당신의 소원을 기반으로합니다.

Dapper의 확장 클래스를 만들고 그 안에 함수를 넣고 대신 사용하십시오. 이렇게 :

    public IEnumerable<T> Query<T>(string sqlQuery, object parameters = null)
    {
        this.activeConnection.Open();

        var result = this.activeConnection
            .Query<T>(sqlQuery, parameters);

        this.activeConnection.Close();

        return result;
    }

그리고 수업의 맨 위에

    public SqlConnection activeConnection { get; private set; }

항상 클래스의 생성자에서 설정됩니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.