문제

리포지토리에 정의된 내용과 서비스에 남겨야 할 내용의 제한 사항이 혼란스럽습니다.리포지토리는 데이터베이스의 테이블과 일치하는 간단한 엔터티만 생성해야 합니까, 아니면 해당 엔터티의 조합으로 복잡한 사용자 정의 개체를 생성할 수 있습니까?

다시 말해서:서비스는 리포지토리에서 다양한 Linq to SQL 쿼리를 작성해야 합니까?아니면 모든 쿼리가 미리 정의된 리포지토리와 비즈니스 로직에서 어떤 메소드를 호출할지 간단히 결정합니까?

도움이 되었습니까?

해결책

실제로 개발자 커뮤니티에서 많은 토론을 생성하고있는 질문을 실제로 제기했습니다. 후속 의견을 참조하십시오. 내 저장소가 iqueryable을 노출시켜야합니까?

저장소는 여러 관련 엔티티를 포함하는 복잡한 조합 객체를 만들 수 있습니다. 도메인 구동 디자인에서는이를 호출합니다 집계 - 관련 물체의 수집은 일부 응집력 구조로 구성되었습니다. 코드를 호출 할 필요가 없습니다 GetCustomer(), GetOrdersForCustomer(), GetInvoicesForCustomer() 별도로 - 당신은 그냥 전화합니다 myCustomerRepository.Load(customerId), 그리고 당신은 이미 인스턴스화 된 속성으로 깊은 고객 객체를 되 찾습니다. 또한 특정 데이터베이스 테이블을 기반으로 개별 객체를 반환하는 경우 완벽하게 유효한 접근 방식이지만 실제로는 저장소가 아닙니다. Sé 당 - 데이터 액세스 계층 일뿐입니다.

한편으로, LINQ-to-SQL이 '스마트'속성과 연기 된 실행 (즉, 고객을로드하지 않으면 실제로 사용할 때까지 명령)을 사용하여 리포지토리 패턴의 완전히 유효한 구현이라는 강력한 주장이 있습니다. 실제로 데이터베이스 코드를 실행하지 않기 때문에 LINQ 문장을 실행하고 있습니다 (그런 다음 기본 LINQ 제공 업체가 DB 코드로 변환).

한편, Matt Briggs의 게시물이 지적한 것처럼 L2S는 데이터베이스 구조 (테이블 당 하나의 클래스)와 매우 밀접하게 결합되어 있으며 제한 사항 (예 : 많은 매핑이 없음)이 있으며 L2S를 사용하는 것이 좋습니다. 데이터 액세스 용 이내에 저장소이지만 L2S 객체를 자신의 도메인 모델 객체에 매핑하고 반환하십시오.

다른 팁

저장소는 데이터 액세스 기술에 대해 아는 유일한 응용 프로그램이어야합니다. 따라서 L2에 의해 생성 된 객체를 전혀 반환해서는 안되지만 해당 속성을 자신의 객체를 모델링하십시오.

이런 종류의 패턴을 사용하는 경우 L2를 생각할 수 있습니다. 데이터 액세스 계층을 생성하지만 실제로 임피던스 불일치를 처리하지는 않으므로 수동으로 수행해야합니다. nhibernate와 같은 것을 보면 그 매핑은보다 강력한 방식으로 수행됩니다. L2S는 쉽게 확장 할 수있는 빠르고 더러운 달을 원하는 2 계층 애플리케이션에 더 가깝습니다.

LINQ를 사용하는 경우 저장소는 LINQ 구문의 컨테이너여야 한다고 생각합니다.이는 모델 객체 인터페이스에서 데이터베이스 액세스 루틴의 추상화 수준을 제공합니다.위에서 Dylan이 언급한 것처럼 이 문제에 대한 다른 관점이 있습니다. 일부 사람들은 IQueryable을 반환하여 나중에 저장소 이후에 데이터베이스를 계속 쿼리할 수 있기를 원합니다.애플리케이션에 대한 표준이 명확하다면 이러한 접근 방식 중 어느 것에도 문제가 없습니다. 여기에서 LINQ 리포지토리에 사용하는 모범 사례에 대한 추가 정보가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top