2009-03-12 2 views
2

Linq2를 사용할 때 저장소가 IQueryable을 반환하도록하는 것이 더 좋습니다.Linq2Nibernate 및 IQueryable을 사용하는 인터페이스 디자인

Linq를 사용하여 Nibernate를 사용하면 .First() 또는 Single() 등의 메소드를 호출 할 때까지 쿼리가 "실행되지 않습니다. 그래서 모든 인터페이스에서 IQueryable을 반환하는 것이 가장 좋지 않으므로 실행 전에 표현식 트리를 조작 할 수 있습니다.

내 리포지토리는 서비스에 의해 호출되며 IServicie에서 상속됩니다.

편집 :

우선은 정말 모든 해답을 주셔서 감사합니다. 그러나 나는 그 질문에 약간을 더하고 싶다. 나는이 디자인이다. 나는 시험 주위의 예약을 완전히 이해하지 못한다. 프로세스가 모든 포인트 IE에서 모든 필터 포인트에서 테스트되는 한 실제로 차이점은별로 없습니다.

또한 :

는 저장소가 IQuerrable을 반환하지 않는 경우 Linq2Nibernate 사용을위한 어떤 지점이 있습니까?

답변

3

개인적으로 생각하지 않습니다. 저장소에서 조합 가능한 쿼리를 노출하는 문제는 더 이상 전체 단위 테스트를 수행 할 수 없다는 점입니다. 즉, 해당 동작 (및 성공)은 이제 호출자의 자비에 있습니다. 예를 들어 .Where(x=>SomeUnmappedMethod(x)) (번역 없음)을 수행 할 수 있습니다. 이 here에 대해 더 자세히 설명했습니다.

IList<T> 또는 T[]을 반환하는 고정 된 메서드가있는 경우 단위 테스트에서 작동하면 실제 (구성 오류가없는 경우) 작동하는지 확인할 수 있습니다. 또한 DAL을 독립적으로 프로파일 링 할 수 있고 SQL (기타)이 실행될 것이라는 것을 확신 할 수 있음을 의미합니다. 발신자에 따라 변경되는 DAL을 프로파일 링/최적화 할 수 없습니다.

(내 LINQ - 투 - SQL 사용에 따라, LINQ - 투 - NHibernate에하지 특히)

+0

격리와 관련하여로드되지 않은 호출자에게 여전히 액세스하고 있지 않습니까? – eglasius

+0

나는 당신의 말을 정말로 고맙게 생각하지만 실제로 Linq2Nibernate를 완벽하게 사용하지는 않습니까? "파이프와 필터"형식의 패턴을 적용 할 수 없다면 실제로 사용하는 데 어떤 이점도 보이지 않습니다. PRE 데이터베이스 가져 오기 –

+0

@Ted 당신은 아주 비슷한 방식으로 작동 할 수있는 사양 패턴을 사용합니다 ... 기본적으로 (메서드를 호출 한 후 적용하는 것과는 반대로) – eglasius

1

그것은 당신의 "저장소"(때문에 모호함의 따옴표를) 소모 있는지에 따라 달라집니다. 마지막 레이어 (UI)와 같은 것이 리포지토리 클래스를 사용하면 이 아닌 것으로 말하면,은 IQueryable을 반환합니다. 그러나 UI 레이어와 데이터 액세스 레이어 사이에 또 ​​다른 레이어가 있으면 예라고 말하고 IQueryable을 반환하고 중간 레이어에서 쿼리 실행을 처리하게하십시오. 데이터 액세스 계층 (DAL)/(문 등이있는 경우) 어떤 시험 거의가 있어야 당신이 실제 로직을하지 않는 한 나는 대부분의 말을 저장소 테스트로

편집

. 그 시점에서 프레임 워크를 테스트하고 있습니다. 내 제안은 BLL 또는 IQueryable 쿼리의 실행을 처리하는 것과 같이 액세스 레이어 (UI)와 DAL 사이에 다른 레이어를 배치하는 것입니다. 그렇게하면 저장소가 쿼리를 반환 할 수 있고 BLL이 쿼리를 실행하고 테스트 할 수있는 로직을 수행 할 수 있습니다.

+0

이 경우 그것은 프레임 워크를 테스트하지 않고, 통합 테스트를하고 있습니다 - 데이터베이스의 현재 버전을 사용하고 있는지 확인합니다. 즉, 누군가가 파기 할 기회를 만들지 않았을 것입니다 ... 저는 "단위 테스트"라고하는 marc에 관심이있었습니다. 그 잘못된 견해 – eglasius

0

내가 된 IQueryable로하지 않습니다,하지만 난 조금 다르게 할 이유가 설명 할 것 :

  • 쉽게이 저장소를 조롱 할
  • 통합 테스트를 사용하는 다른 코드를 테스트 - 대부분의 질의를 일으키는 요소가 저장소에 있으므로 실제로 집중된 통합 테스트를 수행 할 수 있습니다.
  • 첫 번째와 관련하여 코드를 확인하기 쉽고 저장소에 대한 적절한 호출을 수행하고 있습니다. 이것은 호출 코드가 필터 정보를 저장소 메소드 호출에 전달하기 때문이며 결과에 대해 필터 정보를 적용하기 때문입니다.
관련 문제