2011-08-10 3 views
2

WCF 서비스를 제공하는 Entity Framework (4.1)를 사용하여 웹 사이트를 만들고 WCF를 통해 서버와 통신하는 Silverlight 클라이언트가 있습니다. 프록시/래퍼 등의 클래스를 생성하지 않고이없는 을 WCF 서비스를 통해 일부 엔티티를 보내고 (그리고 수신 할 수 있도록) 싶습니다. 예를 들어 Username, Password, Email 필드가있는 User 엔티티 유형이 있고 실제로이 기능을 더 많이 유지하기 위해 단축되었습니다.이 개체를 Silverlight 클라이언트로 보내려고합니다. 사용자 이름과 이메일을 보내는 동안 나는 (분명히) Password 속성을 클라이언트에 보내지 않기를 바란다. 이제는 속성이 [Serializable]이고 속성이 [DataContract] 인 래퍼를 작성 중이며 [DataMember] 특성을 가진 필드가 있습니다. 필요한 필드 만 포함하고 새 인스턴스를 만들고 엔터티 개체의 값을 복사 한 다음 프록시 개체를 보냅니다. 그것은 효과가 있지만 불편하고 극도로 고통 스럽습니다. 내가 원하는 속성을 직접 설정할 수 있고 단순히 다른 것을 노출시키지 않는 메커니즘이 필요합니다. EDMX를 터치 할 때마다 엔티티 모델 코드가 자동으로 재생성되므로 속성을 추가/편집하기 위해 코드를 변경할 수 없습니다. 선택한 멤버 만 클라이언트에 공개하는 방법이 있습니까?WCF를 통해 엔터티를 직접 전송하는 방법

+2

좋은 질문입니다! 자신의 사용자 정의 POCO를 드러내는 것이 내가하는 방법을 알 수있는 유일한 방법입니다. – Jay

+1

제이와 동의합니다. 필요한 [DataMembers] 만 포함하는 [DataContract] 특성으로 장식 된 DTO 클래스를 만들어야합니다. EF 생성 엔티티에서 DTO로 매핑해야합니다. –

+0

글쎄, 좋아, 그럼, 나는 내가하고있는 것처럼가는 것과 같은 방식으로 계속하고있다. 나는 그게 최선의 방법이라고 확신하고 싶었다. 나는 그 대답을 받아 들일 수 있었다. 대답은 어쨌든 :) –

답변

2

클라이언트에서 PROXY 엔터티를 피하려면 클라이언트가 이미 서버 엔터티 어셈블리를 참조하는지 확인하여 동일한 엔터티 (클라이언트 및 서버 측)를 재사용 할 수 있습니다 (POCO를 EF에 매핑 한 후 분리 한 것으로 가정). 자신의 집합으로). 그런 다음 서버 참조에서 고급 옵션을 확인하고 "참조 된 어셈블리의 유형 재사용"이 선택되어 있는지 확인하십시오.

그러면 프록시 인터페이스와 클라이언트가 만들어 지지만 서버 엔터티는 다시 사용됩니다.

서비스 참조 대신 일반 ClientBase<>을 사용하여 프록시 인터페이스를 피할 수 있지만 서비스 측 인터페이스 (서비스 계약 인터페이스)를 별도의 어셈블리로 제거하고 두 클라이언트에서이를 참조해야합니다. 및 서버.

귀하의 관찰에 따라 귀하의 개체에 [DataMember]로 표시하지 않으면 일련 화되지 않습니다. 같은 엔티티를 양쪽 모두 가지고 있기 때문에, 같은 필드는 클라이언트의 기본값 (0, null 등)으로 나옵니다.

+0

좋은 해결 방법이지만, 노출되지 않은 멤버에 대한 기본값/null 값을 갖는 것은 좋은 프로그래밍 습관은 아니지만 그 내용을 살펴 보겠습니다. –

관련 문제