단계별 설명 리포지토리 패턴 설명 [닫힘]


276

누군가 .NET의 리포지토리 패턴을 단계별로 설명하여 매우 간단한 예 또는 데모를 제공 할 수 있습니까?

나는 이것이 매우 일반적인 질문이라는 것을 알고 있지만 지금까지는 만족스러운 답변을 찾지 못했습니다.



1
여기에 좋은 글이 있습니다 : deviq.com/repository-pattern
ssmith

답변:


199

요약하면 리포지토리 패턴의 영향이 더 큽니다. 객체가 어떻게 유지되는지 알 필요없이 모든 코드가 객체를 사용할 수 있습니다. 테이블에서 오브젝트로의 맵핑을 포함하여 지속성에 대한 모든 지식이 저장소에 안전하게 포함됩니다.

종종 코드베이스에 SQL 쿼리가 흩어져 있고 테이블에 열을 추가 할 때 코드 파일을 검색하여 테이블 사용법을 찾아야합니다. 변경의 영향은 광범위합니다.

저장소 패턴을 사용하면 하나의 오브젝트와 하나의 저장소 만 변경하면됩니다. 영향은 매우 작습니다.

리포지토리 패턴을 사용하는 이유에 대해 생각하는 것이 도움이 될 것입니다. 몇 가지 이유는 다음과 같습니다.

  • 데이터 액세스를 변경할 수있는 단일 장소가 있습니다

  • 테이블 세트를 담당하는 단일 장소가 있습니다 (보통)

  • 테스트를 위해 저장소를 가짜 구현으로 쉽게 교체 할 수 있으므로 단위 테스트에 사용 가능한 데이터베이스가 없어도됩니다.

예를 들어 MySQL을 사용 중이고 SQL Server로 전환하려는 경우 다른 이점도 있지만 실제로 실제로 본 적이 없습니다!


28
dbms a에서 b로 다시 전환하면, 이것을 보았을뿐만 아니라 프로덕션 코드 에서이 작업을 수행했다는 기록을 남길 것입니다. 우리는 이전에 Oracle을 사용하고 호스팅 공급자를 전환하고 Azure를 지원하기 전에 (Oracle을 지원하기 전에) SQL Azure로 변환해야했습니다. 불행히도 그 시점에서 모든 데이터 액세스 로직을 분리하지는 않았지만 마이그레이션을 수행했을 때와 마찬가지로 추가했습니다.
Joe

5
나는이 의견이 오래되고 주제가 아닌 것으로 알고 있지만 여러 회사 에서이 의견을 보았습니다. 일반적으로 ORM을 향하거나 ORM으로부터 멀어지는 과정의 일부입니다. 리포지토리는 특히 추상 팩토리 패턴에서로드하거나 IoC 컨테이너를 사용하는 경우이를 쉽게 전환 할 수 있습니다.
Derek Van Cuyk

실제로 Repository는 데이터 소스 관련 작업에 DAO를 사용합니다 ...
Yousha Aleayoub

1
@YoushaAleayoub 좋은 점을 지적합니다. 일반적으로 사람들이 "데이터베이스를 분리"하려고 할 때는 데이터 액세스 개체를, 사람들이 "조회를 책임지는 단일 항목을 만들려고"할 때는 리포지토리를 찾을 수 있습니다. 거의 모든 경우에 두 가지를 모두 찾을 수 있습니다. DAO를 부분은이다 IConnection, ICommand등 부분이 가죽 데이터베이스의 유형입니다. 저장소는 일반적으로 도메인 중심입니다.
펜턴

181

이 좋은 예입니다 : C #에서 리포지토리 패턴의 예

기본적으로 리포지토리는 데이터베이스에서 데이터를 정확히 가져 오거나 유지하는 방법에 대한 세부 정보를 숨 깁니다. 커버 아래 :

  • 읽기 위해 제공된 기준을 만족하는 쿼리를 작성하고 결과 세트를 리턴합니다.
  • 쓰기를 위해 기본 지속성 엔진 (예 : SQL 데이터베이스)이 데이터를 저장하는 데 필요한 명령을 발행합니다.

13
이 예제는 MSDN 설명서보다 단순히 더 나은 설명입니다.
Teoman shipahi

2
나는 이것을 아주 잘 발견했다 . 또한 작업 단위에 대한 적절한 설명을 제공합니다. 이는 저장소 패턴보다 데이터 패턴의보다 일반적인 형태 인 것 같습니다
Celdor

8
연결된 예는 리포지토리 패턴 오류입니다. Entity Framework ( IDbContext) 또는 nhibernate ( ISession)에서 직접 제공하는 인터페이스를 사용하는 것과 비교할 때 전혀 이점이 없습니다 . 올바르게 구현 된 저장소는 모든 지속성 특정 정보 (현재 Linq To Sql 공급자의 작동 방식 등)를 추상화합니다. 즉 노출하지 마십시오 IQueryable.
jgauffin

3
@jgauffin IQueryable은 지속성 특정 정보가 아닙니다. IQueryable의 백업은 하드 코딩 된 배열만큼 간단하거나 XML 파일, 웹 서비스, 데이터베이스, 플랫 파일 등에서 나올 수 있습니다. 항상 IQueryable을 노출시키지 않는 저장소는 권장하지 않습니다. 지속성 저장소에 해당 기능이있는 경우 IQueryable을 노출하면 일부 인스턴스에서 성능 향상을 수행 할 수있는 모든 경우에 데이터 액세스 속도가 느려집니다. 또한 DbContext를 숨기면 필요한 경우 (또는 ORM이 아닌 경우) 다른 ORM으로 전환 할 수 있습니다.
Robert McKee

5
지속성 정보 특정 정보가 유출됩니다. IN특정 LinqToSql 공급자가 어떻게 수행하는지 알지 못하고 열성 / 지연 적로드를 사용하거나 SQL 절을 작성하십시오.
jgauffin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.