2012-06-28 2 views
0

Visual Studio 2010에서 OR 디자이너를 사용하여 맨 위에 데이터베이스 (SQL Server 2008 Express)를 만들고 LINQ to SQL 엔티티 (LINQEntitiesDataContext)를 만들었습니다. 그런 다음 리포지토리 클래스 및 관련 IRepository 인터페이스를 제공하며, 데이터 엔티티에 의미있는 액세스를 제공하는 간단하고 유용한 CRUD 메소드가 포함되어 있습니다.OData를 리포지토리 패턴과 함께 사용

IQueryable<User> QueryUsersByType(UserTypeEnum userType) 

다른 :

void CreateUserWithDefaultType(User user) 

가 지금은 "와이어를 통해"가능한이 저장소를 만들고 액세스를 제공하기 위해 WCF 데이터 서비스 (하나로, OData)을 사용하고자 할 예를 들어, 방법이 있어요 . 그러나 내가 본 OData의 모든 예는 데이터 엔티티 클래스가 IUpdatable을 구현하도록 만든 다음이 데이터 컨텍스트 클래스를 참조하는 WCF 데이터 서비스를 생성하여 엔티티 자체 (예 : Users 엔티티)에 대한 직접 액세스를 제공합니다. 필자의 경우, 이는 LinqEntitiesDataContext를 IUpdatable로 만들고 서비스 유형으로 사용하는 것을 의미합니다. 이는 Repository 클래스 사용을 완전히 피할 수 있습니다.

은 내가 데이터 서비스 내 저장소 노출 할 필요가 느낌 얻을 : 기존 업데이트 방법에 대한 호출을 방지

DataService<Repository> // *Not* DataService<LinqEntitiesDataContext> 

을하지만 내 저장소가 IUpdatable 구현 확인해야합니다 (예 : CreateUserWithDefaultType)

여기서 내가 무엇을 놓치고 있습니까? 엔티티 레이어가 아닌 리포지토리 레이어를 노출하는이 방법을 사용하는 좋은 예가 있습니까?

답변

3

@ Bull은 여기 오른쪽 경로에 있었지만 조금 더 답변을 만들고 싶습니다.

그가 말했듯이, OData는 주로 미리 정의 된 방법이 아닌 엔티티와 함께 ​​작동하도록 설계되었습니다. 예를 들어 첫 번째 예제를 얻으려면 IQueryable of User를 노출하면 OData 클라이언트는 과 같은 URL을 작성할 수 있습니다. WCF Data Services 클라이언트를 사용하는 경우 context.Users.Where(u => u.UserType == "Administrator")과 같은 작업을 수행 할 수있는 LINQ 공급자가 있습니다. (또한 WCF Data Services는 현재 서비스 모델에서 enum을 지원하지 않습니다.)

마찬가지로 두 번째 방법은 일반적으로 http://yourdomain/Users의 POST 일 것입니다. 첫 번째 방법에서 본 것과 동일한 IQueryable of User 예) 모델이나 데이터베이스에서 기본 유형을 설정합니다. 당신이 정말로 당신의 저장소를 사용하려는 경우

, 당신은 아마 알렉스의 블로그에 설명 된대로 전체 사용자 정의 데이터 서비스 제공을 처리하는 것이 가장 좋은 선택이 될 것입니다 : http://blogs.msdn.com/b/alexj/archive/2010/01/07/data-service-providers-getting-started.aspx

최종 점 - 우리는 우리의 공급자가 공개하기를 바랍니다 가까운 미래; 이렇게하면 여기에서 성취하려고하는 것을 크게 단순화 할 수 있습니다. 이 게시물은 해당 기능의 중요성에 대한 또 다른 심판으로 간주 할 것입니다.:)이 답변에 약간의 수정의

HTH, 마크

+0

흠, 그러니까 내 데이터 모델에 좋은 깨끗한 인터페이스를 단 한번 구현할 수 없으며 서비스 소비자에게 혜택을 줄 수 있습니다. 대신 비즈니스 로직 계층의 각 구성 요소는 필터를 적용하고, 외래 키를 확장하고, 페이징을 구현하는 등 엔터티 수준에서 작업해야합니다. 서비스 운영을 통해 원하는대로 할 수 있습니까? 엉망?! – MarkH

+0

당신이하고 싶은 일 중 일부는 분명히 서버 측에서 할 수 있습니다. EF 공급자와 작업하는 경우 페이징은 서버 측에서는 쉽지 않습니다. 그렇지 않으면 너무 어렵지 않습니다. 필터를 미리 적용하고 외래 키를 확장하는 것이 가능합니다. 바로 가기 위해 더 열심히 노력해야 할 수도 있습니다. Service Ops는 당신이 원하는 모든 것을 할 수는 있지만 엉망이 될 수 있습니다. 이야기의 도덕 : 우리는 공공 공급자의 우선 순위를 정해야합니다. –

+0

좋아, 내가 듣고 싶지 않았지만 의견을 보내 주셔서 감사합니다. 다른 방법으로 청구서에 부합하는대로 OData를 아키텍처 계층 간 인터페이스로 활용 해 보겠습니다. – MarkH

0

사진이 누락되었다고 생각합니다. OData는 엔티티를 피드로 노출합니다. 여기 하나로, OData는 WCF 데이터 서비스 중 하나로, OData/WCF 데이터 서비스에 대한 기본 사진을 얻을 수있는 적절한 장소라고이다 : 서비스로 데이터를 노출 MSDN http://msdn.microsoft.com/en-us/library/cc668796에서

  1. 빠른 시작 자습서
  2. 은. http://msdn.microsoft.com/en-us/library/dd728286
+0

그냥 몇 - 하나로, OData 피드로 엔티티를 노출하지 만있다,하지만 확실히 가장 일반적인 사용 사례입니다. 또한 WCF 데이터 서비스는 Microsoft에서 OData (프로토콜)를 구현 한 것입니다. 미성년자이지만 OData는 표준화를 지향하지만 WCF Data Services는 표준화되지 않습니다. (그냥 표준을 구현할 것입니다.) –

+0

고마워요. – Bull

관련 문제