클래스에 공통 데이터베이스 연결을 배치 할 위치 데이터베이스에 연결해야합니다. 나는

데이터베이스에 / 데이터베이스에서 일부 객체를 저장 / 검색하는 작업을 수행하는 여러 클래스 (리포지토리)가 있습니다. 모두 하나의 데이터베이스에 연결해야합니다.

나는 다시 정의하는 것을 방지하기 위해 생각 ConnectionString과를 SqlConnection그들에게 열려있는 연결을 전달, 각 클래스에서. 그렇다면 언제 어디서 언제 해당 연결을 정의 / 열고 클래스에 전달할 수 있습니까?

이 공통 자원에 액세스 할 수있는 더 나은 접근 방법 / 패턴이 있습니까?



답변

각 클래스에 공개 연결을 전달하는 것이 가장 좋은 아이디어는 아닙니다. 데이터베이스 연결 작성을 읽으십시오 -한 번 또는 각 쿼리마다 수행합니까?

열린 연결을 리포지토리에 전달하는 대신 실행하려는 각 쿼리마다 연결을 열고 닫는 것이 좋습니다.

연결 관리에 도움이되도록 이와 같은 방법을 시도해 볼 수 있습니다.

public class Repository
{
    private readonly string _connectionString;

    public Repository()
    {
        _connectionString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString
    }

    protected SqlConnection GetConnection()
    {
         return new SqlConnection(_connectionString);
    }


}

public sealed class UserRespository : Repository
{

    public User GetUsers()
    {
        using (var connection = GetConnection())
        {
            using (var commnad = new SqlCommand("SqlQuery", connection))
            {
                //Execute Query
                //Return results
            }
        }
    }
}

답변

열린 연결을 가지고 클래스간에 전달하는 것은 일반적으로 나쁜 생각입니다. 물론 연결을 여는 것은 성능에 상당한 영향을 미치지 만 이미 열린 연결을 재사용하여 연결 풀에서 이미 처리했습니다. 그러나주의 사항 : 항상 connection.Open()멀티 스레드 코드에서 가능한 한 오랫동안 호출 하면 메소드에 대한 연결이 할당되므로 데이터베이스에 대한 열린 연결의 필요량을 증가시킬 수 있기 때문에 항상 대기 하십시오.

클래스를 가능한 한 일반적으로 만들려면 IDbConnection을 사용하여 메소드를 노출하는 기본 클래스를 사용하는 것이 좋습니다. 저장소에는보다 일반적인 구현이 있습니다.

internal abstract class Repository
{
    private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["myconnectionstring"].ConnectionString;

    protected IDbConnection GetConnection()
    {
        return new SqlConnection(ConnectionString);
    }
}

public class MyRepository : Repository
{
    public IEnumerable<object> Get()
    {
        using (var connection = GetConnection())
        {
            connection.Open();

            ...
        }
    } 
}

답변