LINQ to SQL을 좋아하지만 LINQ to SQL 프레임 워크에서는 저장소 코드가 생성되어 SQL Server 데이터베이스와 밀접하게 결합됩니다.LINQ to SQL을 사용할 때 어떻게 퍼시스턴스 코드를 추상화합니까?
LINQ to SQL을 추상화 된 느슨하게 결합 된 방식으로 사용하는 사람이 있습니까? 그렇다면 코드 데이터베이스 독립적 인 문제에 어떻게 접근 했습니까?
LINQ to SQL을 좋아하지만 LINQ to SQL 프레임 워크에서는 저장소 코드가 생성되어 SQL Server 데이터베이스와 밀접하게 결합됩니다.LINQ to SQL을 사용할 때 어떻게 퍼시스턴스 코드를 추상화합니까?
LINQ to SQL을 추상화 된 느슨하게 결합 된 방식으로 사용하는 사람이 있습니까? 그렇다면 코드 데이터베이스 독립적 인 문제에 어떻게 접근 했습니까?
나 자신을 위해; LINQ/dbml이 생성하는 객체 모델을 다시 사용하는 것은 만족 스럽습니다. 왜냐하면 실제로 속성이 나를 해치지 않으며 다른 구현체도 충분히 비슷한 모델을 제공 할 수 있기 때문입니다. 그러나 데이터 컨텍스트를 사용하지 않습니다. DAL 외부. 그래서 같은 있습니다
IFooRepository
을 - 생성 된 DBML 개체와 일부 POCO 모델 클래스FooRepository
모두 사용 가능한 메소드를 정의 - 데이터 컨텍스트에 대해 알고 구현을 내 저장소 메서드는 IQueryable<T>
및 Expression<...>
과 같은 LINQ 개념을 노출하지 않습니다. 이는 leaky abstractions이므로; 다른 구현은 다르게 작동합니다 (EF는 예를 들어 두 가지의 다른 측면을 지원합니다).
추가 - 대부분의 연관성 속성을 내부로 표시하고 DAL 쿼리 중에 만 사용합니다 (OO 작업 중에는 그렇지 않습니다).
순수 POCO에 매핑 할 수 있지만 이점이 표시되지 않습니다. 여기에 더 많은 생각이 있습니다 : Pragmatic LINQ.
NerdsDinner에서 사용 된 것과 비슷한 방식을 사용할 수 있습니다. 이 프로젝트는 문맥을 데이터베이스에 대한 게이트웨이로 사용하고 그 주위에 저장소를 만듭니다.
이러한 종류의 저장소 패턴은 호출 된 메소드에 따라 조건, 필터, 정렬 명령 등을 추가 한 다음 추가 변경을 위해 문을 열어 둔 호출자에게 IQuerable을 반환합니다.
사실 당신은 NHibernate ISession 주위에 저장소를 만들 때 거의 같은 방식으로 작업을 수행합니다.
예를 들어 LinqtoSql을 NHibernate로 바꾸기로 결정했다면 datacontext 대신 Linq 세션을 리포지토리 내에서 쿼리하면됩니다. 물론 LinqtoSql이 자동으로 추가하는 속성을 사용하여 부분 클래스를 완성해야합니다.
Mouk 위의 NerdsDinner에서 저장소 패턴을 언급도 빨리 여기를 설정하는 방법에 대한 튜토리얼있다 : http://www.asp.net/learn/mvc/tutorial-10-cs.aspx
이쪽 NerdsDinner 이전에 출시 된 튜토리얼의 좋은 작은 시리즈
. 이 개념은 전통적인 asp.net 웹 양식 앱에서도 설정할 수 있습니다. http://www.asp.net/learn/mvc/tutorial-16-cs.aspx
이봐 나단, 좋은 질문 :
또한, 나는 대신, 몇 가지 기본가 여기에 있습니다 엔티티 (새로운, 그리고 다른 DB에 대한 더 많은 지원)에 Linq에를 사용하는 것이 좋습니다 것입니다.
다른 사람들이 말했듯이 가장 좋은 방법은 모든 GET/WRITE 메서드를 추상화하고 비즈니스 로직에서 DataContext를 완전히 숨기는 것입니다.
내 접근 방식은 DAL에 필요한 것을 수행하기 위해 리플렉션을 사용하는 일련의 일반 메소드를 작성하는 것이 었습니다.
이 경우 메소드가 객체 (예 : "Product")를 받으면 ORM/데이터 액세스 기술과 독립적으로 내부적으로 원하는 모든 작업을 수행 할 수 있습니다. 원한다면 문자 그대로 SQL의 문자열을 몇 가지 매개 변수와 객체의 반사를 기반으로 작성할 수 있습니다.
항상이 작업만으로도 LINQ와 SQL이 완전히 분리되지는 않습니다.
문제는 실제로 엔티티 자체입니다. 데이터를 검색하는 방법을 추상화하더라도 비즈니스 논리를 계속 따라 그 Entities를 사용할 수 있습니다.
내 자신의 연결이 끊어진 엔터티를 다시 쓰는 것이 내가 아직 교차 할 준비가되지 않은 것처럼 보였기 때문에, 지금은 내가 함께 살 준비가되어있는 것처럼 느낍니다. 불필요한 일이 많이 ...
나는 다른 사람들이 어떻게 태클을하는지보고 싶다.
건배!
그래, 그게 내 주된 문제 야. 아마도 엔티티가 인터페이스로 추출 될 수 있습니까? 그렇게하면 인터페이스 추출을 포함하여 코드 생성 이점을 얻고 일반 사항대로 LINQ to SQL을 사용하여 디자인을 제어 할 수 있지만 그런 다음 인터페이스를 적절한 상태로 유지하여 요약 할 수 있습니다. –
흠 .... 잠깐만, LINQ to SQL을 통해 클래스를 생성하라. 그런 다음 코드에서 LINQ to SQL에 연결 해제 된 클래스를 사용하지만 각각의 LINQ와 SQL 클래스를 일치시키는 인터페이스를 구현해야합니까? 그게 맞습니까? 나는 당신이 이것으로가는 곳, 아주 멋진 아이디어를 볼 수 있습니다. 세부 사항이 확실하지 않지만 어쩌면 명확히 할 수 있을까요? 내 유일한 관심사는 당신이 여전히 반복적 인 (?) 코드를 작성해야한다는 것입니다. 또한, 이제는 그것에 대해 생각해 보면 후기 바인딩과 엔티티 관계를 잃을 것입니다 ... 어떻게 생각하십니까? – andy
모든 비즈니스 로직과 프리젠 테이션 코드가 인터페이스를 통해 엔티티를 참조한다면, 이론적으로는 생성 된 엔티티를 필요에 따라 완전히 삭제하고 모든 linq 코드를 리포지토리에 유지하고 부분 클래스를 사용할 수 있습니다. 생성 된 엔티티가 인터페이스를 "구현"하는지 확인합니다. 그런 다음 우리가해야 할 일은 resharper 또는 다른 것을 사용하여 공개적으로 노출 된 모든 요소를 인터페이스로 밀어 올리는 것입니다. 그런 다음 인터페이스를 업데이트 된 상태로 유지하는 것 외에는 작성할 코드가 거의 없습니다. –
마크, 멋진 블로그 글. +1 –