2009-05-17 2 views

답변

3

나 자신을 위해; LINQ/dbml이 생성하는 객체 모델을 다시 사용하는 것은 만족 스럽습니다. 왜냐하면 실제로 속성이 나를 해치지 않으며 다른 구현체도 충분히 비슷한 모델을 제공 할 수 있기 때문입니다. 그러나 데이터 컨텍스트를 사용하지 않습니다. DAL 외부. 그래서 같은 있습니다

  • IFooRepository을 - 생성 된 DBML 개체와 일부 POCO 모델 클래스
  • FooRepository 모두 사용 가능한 메소드를 정의 - 데이터 컨텍스트

에 대해 알고 구현을 내 저장소 메서드는 IQueryable<T>Expression<...>과 같은 LINQ 개념을 노출하지 않습니다. 이는 leaky abstractions이므로; 다른 구현은 다르게 작동합니다 (EF는 예를 들어 두 가지의 다른 측면을 지원합니다).

추가 - 대부분의 연관성 속성을 내부로 표시하고 DAL 쿼리 중에 만 사용합니다 (OO 작업 중에는 그렇지 않습니다).

순수 POCO에 매핑 할 수 있지만 이점이 표시되지 않습니다. 여기에 더 많은 생각이 있습니다 : Pragmatic LINQ.

+0

마크, 멋진 블로그 글. +1 –

1

NerdsDinner에서 사용 된 것과 비슷한 방식을 사용할 수 있습니다. 이 프로젝트는 문맥을 데이터베이스에 대한 게이트웨이로 사용하고 그 주위에 저장소를 만듭니다.

이러한 종류의 저장소 패턴은 호출 된 메소드에 따라 조건, 필터, 정렬 명령 등을 추가 한 다음 추가 변경을 위해 문을 열어 둔 호출자에게 IQuerable을 반환합니다.

사실 당신은 NHibernate ISession 주위에 저장소를 만들 때 거의 같은 방식으로 작업을 수행합니다.

예를 들어 LinqtoSql을 NHibernate로 바꾸기로 결정했다면 datacontext 대신 Linq 세션을 리포지토리 내에서 쿼리하면됩니다. 물론 LinqtoSql이 자동으로 추가하는 속성을 사용하여 부분 클래스를 완성해야합니다.

0

이봐 나단, 좋은 질문 :

또한, 나는 대신, 몇 가지 기본가 여기에 있습니다 엔티티 (새로운, 그리고 다른 DB에 대한 더 많은 지원)에 Linq에를 사용하는 것이 좋습니다 것입니다.

다른 사람들이 말했듯이 가장 좋은 방법은 모든 GET/WRITE 메서드를 추상화하고 비즈니스 로직에서 DataContext를 완전히 숨기는 것입니다.

내 접근 방식은 DAL에 필요한 것을 수행하기 위해 리플렉션을 사용하는 일련의 일반 메소드를 작성하는 것이 었습니다.

이 경우 메소드가 객체 (예 : "Product")를 받으면 ORM/데이터 액세스 기술과 독립적으로 내부적으로 원하는 모든 작업을 수행 할 수 있습니다. 원한다면 문자 그대로 SQL의 문자열을 몇 가지 매개 변수와 객체의 반사를 기반으로 작성할 수 있습니다.

항상이 작업만으로도 LINQ와 SQL이 완전히 분리되지는 않습니다.

문제는 실제로 엔티티 자체입니다. 데이터를 검색하는 방법을 추상화하더라도 비즈니스 논리를 계속 따라 그 Entities를 사용할 수 있습니다.

내 자신의 연결이 끊어진 엔터티를 다시 쓰는 것이 내가 아직 교차 할 준비가되지 않은 것처럼 보였기 때문에, 지금은 내가 함께 살 준비가되어있는 것처럼 느낍니다. 불필요한 일이 많이 ...

나는 다른 사람들이 어떻게 태클을하는지보고 싶다.

건배!

+0

그래, 그게 내 주된 문제 야. 아마도 엔티티가 인터페이스로 추출 될 수 있습니까? 그렇게하면 인터페이스 추출을 포함하여 코드 생성 이점을 얻고 일반 사항대로 LINQ to SQL을 사용하여 디자인을 제어 할 수 있지만 그런 다음 인터페이스를 적절한 상태로 유지하여 요약 할 수 있습니다. –

+0

흠 .... 잠깐만, LINQ to SQL을 통해 클래스를 생성하라. 그런 다음 코드에서 LINQ to SQL에 연결 해제 된 클래스를 사용하지만 각각의 LINQ와 SQL 클래스를 일치시키는 인터페이스를 구현해야합니까? 그게 맞습니까? 나는 당신이 이것으로가는 곳, 아주 멋진 아이디어를 볼 수 있습니다. 세부 사항이 확실하지 않지만 어쩌면 명확히 할 수 있을까요? 내 유일한 관심사는 당신이 여전히 반복적 인 (?) 코드를 작성해야한다는 것입니다. 또한, 이제는 그것에 대해 생각해 보면 후기 바인딩과 엔티티 관계를 잃을 것입니다 ... 어떻게 생각하십니까? – andy

+0

모든 비즈니스 로직과 프리젠 테이션 코드가 인터페이스를 통해 엔티티를 참조한다면, 이론적으로는 생성 된 엔티티를 필요에 따라 완전히 삭제하고 모든 linq 코드를 리포지토리에 유지하고 부분 클래스를 사용할 수 있습니다. 생성 된 엔티티가 인터페이스를 "구현"하는지 확인합니다. 그런 다음 우리가해야 할 일은 resharper 또는 다른 것을 사용하여 공개적으로 노출 된 모든 요소를 ​​인터페이스로 밀어 올리는 것입니다. 그런 다음 인터페이스를 업데이트 된 상태로 유지하는 것 외에는 작성할 코드가 거의 없습니다. –

관련 문제