리포지토리 패턴을 올바르게 사용하고 있습니까?


15

-repository데이터베이스에서 데이터를 검색하기 위해 접미사로 묶인 별개의 클래스 를 사용하고 있습니다. 각 테이블마다 자체 저장소가 있습니다.

예를 들어 customerrepository고객을 검색하는 모든 종류의 메소드가 있고 클래스를 vacancyrepository사용하여 공석을 검색 하는 클래스가 있습니다 .

이 일을하는 방법에 대한 두 가지 질문이 있습니다.

  1. 여러 테이블에 걸쳐있는 데이터를 가져 오는 것은 어떻습니까? 예를 들어 공석을 만들지 않은 모든 고객을 보여주는 화면이 있습니다. 의 customerrepository메소드를 사용 vacancyrespository하거나 두 저장소 모두에서 결과를 리턴 할 수 있고 dataservice두 저장소 모두에서 결과를 가져 와서 1 개의 결과로 결합 하는 계층 구조의 상위 클래스 (이름은 a )가 있습니까?

  2. 그러한 저장소가 처리 할 수있는 로직은 얼마입니까?
    활성 레코드 만 검색하기 위해 리포지토리에서 'where active == true'를 구현하는 것이 좋다고 생각합니까, 아니면 간단한 로직을 계층 구조에서 더 높은 클래스로 처리해야 dataservice합니까 ( 이름을 a로 지정 )?

내가 지금 시작한 예는 다음과 같습니다.

하나 이상의 질문이 포함 된 질문 목록이 있습니다.
질문은 결과를 가질 수 있으며 이는 별도의 테이블에 보유됩니다.
따라서 질문 목록의 전체 결과를 검색하려면 questionlist테이블, 질문 테이블 및 테이블의 데이터를 결합 해야 questionstatus합니다.

지금 우리는이 테이블을위한 3 개의 다른 저장소를 가지고 있습니다.

questionlistrepository목록 번호 12의 총 결과 가 무엇인지 묻는다면 다른 두 저장소에서 데이터를 가져와야하므로 논리가 있어야합니까?

또는 questionlistdataservice어떤 저장소를 사용할지 아는 사람이 있습니까?

한 가지 더 : 우리의 리포지토리는 IQueryable호출 서비스가 결과를 쉽게 결합 할 수 있도록 결과를 가져올 수 있지만, 그렇지 않은 경우는 어떻습니까? 세 가지 테이블의 모든 내용을 검색하는 것이 좋은 생각은 아닙니다. 데이터 베이스.


1
일반적으로 다중 테이블 액세스에서 주 테이블은 쿼리가 페치하기 전에 존재해야하는 레코드 테이블에 의해 결정됩니다. LEFT OUTER JOIN에서는 첫 번째 테이블이 RIGHT OUTER JOIN에서는 두 번째 테이블이됩니다.

답변:


15

리포지토리 는 도메인 개체를 반환하며 매핑 계층 위에 구축됩니다. 매우 간단한 도메인 도메인 개체와 데이터베이스 테이블은 거의 동일 할 수 있습니다.

저장소가 항상 데이터 구조의 정확한 표현을 리턴하는 경우 실제로는 데이터 액세스 오브젝트 (DAO)라는 테이블 데이터 게이트웨이 일 수 있습니다 .

예 : 데이터베이스에 개인 및 주소 테이블이 있습니다. 응용 프로그램 도메인 주소는 자체의 실체가 아니며 단지 Person의 재산입니다. 이 경우 PersonRepository 및 AddressRepository가 없습니다. PersonRepository가 있습니다. 도메인은 도메인 데이터가 어떻게 유지되는지 걱정하지 않아야합니다. 이러한 책임은 저장소 뒤에있는 계층에 있습니다.

귀하의 예에서 실제로 DAO가 있고 이름을 Repositories로 지정 한 것 같습니다.


리포지토리를 만들 때 테이블 데이터 게이트웨이를 한 수준 더 깊이 가질 수 있으며 우리의 리포지토리는 실제로 TDG입니다.
Michel

1
비용과 이점을 평가할 수 있습니다. 코드 "계층화"원칙에 따라 DAO와 리포지토리를 별도로 유지하는 데 괴롭힘을 당하지 마십시오. 이 경우 가장 읽기 쉬운 것을하십시오. 리포지토리가 DAO의 데이터를 많이 재결합하는 경향이있는 경우 분리 및 결과 추상화 계층이 유용 할 수 있습니다.
Mihai Danila
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.