2014-09-22 1 views
0

저는 현재 저장소 패턴을 사용하고있는 프로젝트에서 작업하고 있습니다. 현재 내 데이터베이스의 각 테이블에 대해 저장소를 구축 중입니다. db가 커짐에 따라 약간 지루 해지고 있습니다. 각 테이블에 대해 수행해야하는지 궁금합니다. 사용자는 드롭 다운에서 방금 사용 된 테이블을 포함하여 모든 테이블을 편집 할 수있는 기능을 요청했습니다. 예를 들어 WorkLocation 테이블에 대한 링크가있는 SubContractor 테이블이 있습니다. SubContractors에는 TypeOfWork 테이블에 대한 링크가 있으며이 섹션만으로도 3 개의 저장소가 구축됩니다. 처음에 SubContractor를 작성하는 것을 생각했지만, 사용자는이 중 하나를 편집하고 싶었 기 때문에 각 저장소를 작성했습니다. 이게 일반적인가요?리포지토리 패턴이 1 : 1이어야하나요?

+2

는 기본 CRUD 작업에 대한 일반적인 기준의 repo의 일종이 없으십니까? – Groo

+2

제네릭은 당신의 친구입니다! 'Repository '을 생성 할 수 있습니다. 여기서'T '는 엔티티 유형 (즉, 테이블 항목을 나타내는 객체)입니다. –

+0

은 제네릭을 조사합니다! – Paritosh

답변

4

사실 리포지토리는 도메인 개체가 다른 데이터 표현 (예 : 관계형 데이터베이스)으로 변환되는 방법을 캡슐화하는 패턴이기 때문에 테이블 당 리포지토리를 만들지 말고 다시 도메인 개체로 변환합니다 .

우선, 1 개의 테이블은 1 개의 도메인 객체 일 수도 있고 아닐 수도 있습니다. Entity Framework 나 NHibernate와 같은 OR/M 프레임 워크는 단순히 테이블에 객체를 매핑하는 것 이상입니다.

도메인 개체는 동일한 도메인의 다른 도메인 개체와 연결되어있을 수 있으며 이는 저장소 뒤에있는 관계형 디자인에 따라 도메인 개체가 하나 이상의 테이블에 유지 될 수 있음을 의미합니다.

루트 엔터티에 대해서만 리포지토리를 구현하는 일반적인 사례가 있습니다. 예를 들어, 도메인 객체가 많고 Employee입니다. 당신은 당신의 마음에 드는 OR/M의 상단에 ICompanyRepository 코드를 구현을 설계해야하고, Employee 창조 Company.Employees1-N 협회에 추가 직원에 의해 수행 될 것이다 : 같은

ICompanyRepository repo = new CompanyRepositoryImplementation(); 
Company myCompany = repo.GetById(839984); 
myCompany.Employees.Add(new Employee { FullName = "Matias Fidemraizer" }); 

좋은 전체 또는/M Entity Framework 또는 NHibernate는 연결을 유지하고 Employees 연관에 직원을 추가하는 간단한 작업은 전체 직원을 생성하기 위해 INSERT을 발행 할 것이며 LINQ (또는 다른 객체 쿼리 접근법)를 사용하여 해당 직원을 쿼리하고 얻을 수 있습니다. .

마지막으로, 당신은 일반적인 저장소를 구현하려고 할 위치, AddRemove (GetById, GetByCriteria (식 트리/LINQ를 사용하여 사용자 정의 기준) 없음Update, 이것은 또한 OR/M 거래에서 처리하십시오 때를 객체 또는 컬렉션 수정) 과 같거나 특정 도메인 요구 사항을 제공하기 위해 파생 될 수 있습니다.

일반 저장소 서명은 다음 샘플과 같습니다

public interface IGenericRepository<TDomainObject> 
    where TDomainObject : DomainObject