차이

0

나는 현재 다음을 수행하고 단정 한 ORM을 사용하여 저장소 패턴을 구현하는 경우 :차이

private readonly ConnectionStrings _connectionStrings; 
private IDbConnection _db; 

public CustomerRepository(IOptions<ConnectionStrings> connectionStrings) 
{ 
    _connectionStrings = connectionStrings.Value; 
    _db = new SqlConnection(_connectionStrings.DefaultConnection); 
} 

public Customer Find(int id) 
{ 
    return this._db.Query<Customer>("SELECT * FROM Contacts WHERE Id = @Id", new { id }).SingleOrDefault(); 
} 

수있는 사람하시기 바랍니다 이 방법으로해야하는지 또는 모든 단일 저장소 함수에서 새 SqlConnection을 사용하여 using 문을 사용해야하는지 알려주십시오.

나는 위의 코드가 UnitOfWork와 같은 것이 필요할 것이라고 가정하고 있습니다. 또한 필요한 모든 저장소 기능을 실행 한 후 연결을 끊는 방법도 있습니다.

+3

모든 메소드에서'using' 문을 사용하십시오. 연결이나 ADO.NET 객체를 전혀 재사용하지 마십시오. [관련] (http://stackoverflow.com/questions/9705637/executereader-requires-an-open-and-available-connection-the-connections-curren/9707060#9707060) –

+1

'using' 문을 사용하십시오. – stuartd

+0

고마워요.하지만 컨텍스트가 종속성 주입을 통해 전달 된 다음 EF를 사용할 때와 같은 몇 가지 예제를 본 이유를 설명 할 수 있습니까? 또한 여러 using 문을 사용하여 UnitOfWork를 구현할 수 있습니까? 나는 다음과 같은 접근법을 사용하려고 생각하고있다 : https://github.com/timschreiber/DapperUnitOfWork –

답변

1

using 문을 사용하는 것이 좋습니다. 사용자 paulwhitthis 대답에 큰 사용법을 설명했다

이유 명령문이이 범위를 벗어나으로 개체가 즉시 배치되어 있는지 확인하는 것입니다 "사용", 그것은 명시 적 코드를 필요로하지 않습니다 이런 일이 발생하는지 확인하십시오.

당신의 방법에 using 문을 가지고와 연결이 클래스 회원이 가진 사이의 근본적인 차이는 using 문은 당신이 당신의 운영을 완료하고 블록을 종료 한 후, 연결이되어 있는지 확인한다이다 폐쇄되고 적절히 처분된다. 이렇게하면 개발자 측에서 오류가 발생할 가능성을 제거하고 일반적으로 모든 것을 더 깔끔하게 만듭니다.

이 상황에서 using 문의 중요한 추가 이점은 예외가 있어도 연결이 처리된다는 것입니다 (이 작업을 수행하는 것이 유일한 방법은 아님) . documentation에 따르면

using 문을 사용하면 개체에서 메서드를 호출하는 동안 예외가 발생하더라도 Dispose가 호출됩니다.

연결을 클래스 구성원으로 만들려면 프로그램이 초기에 종료되도록하는 메서드의 처리되지 않은 예외로 인해 연결이 열려있을 수 있습니다. 이것은 물론 좋은 일이 아닙니다.

매우 합당한 이유가없는 한 요약하면 using 문을 사용하십시오. 일반적으로

1

는 유형이 때때로 다른 유형도 IDisposable을 구현하고 Dispose() 전화 랩 된 객체를 가지고 것을 가지고, 다른 유형에 포장하는 것이 유용 할 수 있습니다 (using 작동 따라서 등) IDisposable를 구현하는 경우 그런 다음 using (또는 Dispose()을 호출하는 다른 메커니즘)을 사용하십시오.

질문은 이것이 인 경우가 아니면 중 하나인지 여부입니다.

그렇지 않습니다.특히 SqlConnection은 무대 뒤에서 풀링을 구현하므로 (실제로 연결 문자열에서 옵트 아웃하지 않는 한) Dispose() 대신 서버에 대한 전체 연결을 종료하면 실제로 발생하는 것은 SqlConnection 어셈블리의 내부 객체 동일한 연결 문자열을 사용하는 SqlConnection이 열릴 때 다시 사용하기 위해 연결 세부 정보가 풀에 저장됩니다.

이것은 응용 프로그램이 SqlConnection 클래스의 많은 용도에 대해 가능한 한 적은 수의 연결을 효율적으로 사용할 수 있음을 의미합니다. 그러나 수영장에 가능한 한 신속하게 돌아 가지 않음으로써 수영장과의 연결을 유지함으로써이를 방해합니다.

+0

그래서 당신이 말하고있는 것처럼 보입니다 : 함수마다 문장을 사용하는 것은 그렇게 나쁘지 않습니다. 트랜잭션에 여러 명령문을 배치해야하는 경우 어떻게해야합니까? 리포지토리 또는 여러 리포지토리에서 3 개의 개별 함수를 호출하여 트랜잭션에서 모두 실행할 수 있습니까? 함수마다 using 문이 있으면 이렇게 힘들 것 같습니다. –

+1

아니요, 더 자세히 설명하겠습니다. 함수 별 명령문을 사용하는 것이 좋습니다! 트랜잭션은 비록 비록 풀링 메커니즘이 트랜잭션 인식인지 아닌지를 잘 모르겠다. 그렇기 때문에 여전히 잘 작동하는지 여부는 인정할 필요가있다. –