2009-04-12 2 views
12

저는 리포지토리 패턴을 처음 접했고 웹에서 많은 독서를 한 후에 무슨 일이 일어나는지 대략적인 이해가 있었지만 아이디어가 상충되는 것 같습니다.저장소 패턴 - POCO 또는 IQueryable?

IRepository가 반환해야하는 것은 하나입니다.

그래서 같은, 그래서 모든 집계 루트에 대한 IRepository 구현있을 것입니다 만 포항 강판 거래 싶습니다 : IOrangeCriteria는 오렌지를 찾는 특정 인자의 번호를 취

public class OrangeRepository: IOrangeRepository 
{ 
    public Orange GetOrange(IOrangeCriteria criteria); 
} 

.

내가 가지고있는 다른 것은 많은 데이터 백 엔드입니다. 이것이 내가이 패턴을 첫 번째로 얻은 이유입니다. 내가 각각에 대한 구현을해야합니다 상상 예를 들어

OrangeRepositoryOracle, OrangeRepositorySQL, OrangeRepositoryMock 등

내가 EF이나 NHibernate에 사용할 수 있도록 개방을 유지하고자하는 - 다시 경우 포항 강판의 내 IOrangeRepository 거래 나서 OrangeRepositoryNHibernate 등을 구현하여 저장소 자체에 캡슐화 할 수 있습니다.

올바른 행에 있습니까?

감사

편집 : 감사 의견에 대해, 나는 그것을 감사합니다, 그래서 순간에 아이디어를 반송하는 다른 사람이 없습니다!

답변

9

예, 귀하의 버전은 가장 안전하고 호환 가능한 버전입니다. 데이터 액세스뿐만 아니라 웹 서비스, 파일 등 모든 리소스와 함께 사용할 수 있습니다.

IQueryable 버전에서는 여전히 POCO 클래스를 기반으로 작동하지만 IQueryable에 묶여 있음을 유의하십시오. 또한 IQueryable을 사용하는 코드를 가지고있을 수 있다고 생각한 다음 저장소 ORM 중 하나가 올바르게 처리하지 못하는 경우를 발견했습니다.

5

나는 당신과 같은 패턴을 사용합니다. 나는 그것을 많이 좋아. 모든 리소스에서 데이터를 가져올 수 있습니다.

그러나 IQuerable을 사용하면 OrangeCriteria와 같은 자체 기준 API를 코딩 할 필요가 없다는 장점이 있습니다.

NHibernate가 완전 Linq 지원을 얻으면 IQueryable로 전환 할 수 있습니다.

그럼 당신은 얻을

public class OrangeRepository: IOrangeRepository { 
    public IQueryable<Orange> GetOranges(); 
}