2012-02-22 3 views
0

시나리오 : 데이터 모델의 엔터티가 다양한 정보가 포함 된 WCF 웹 서비스에 전달되고 데이터베이스에 저장 된 다음 추가 정보로 완전히 채워진 개체와 함께 반환됩니다. 이 예에서 입출력에 따라 WCF 웹 서비스에서 DataMember 속성을 변경 하시겠습니까?

public class Request 
    { 
    public virtual Guid RequestID { get; set; } 
    public virtual string RequestType { get; set; } 
    public virtual System.DateTime CreatedDate { get; set; } 
    //More properties here populated from DB 
    } 

    [OperationContract] 
    Request CreateRequest(Request input); 

는 RequestID가 CreatedDate 및 초기 요구시에 보이지 않아야 따라서 레코드가 데이터베이스에 삽입 된 경우에만 채워하고있다. 그러나 객체가 반환 될 때 표시되어야합니다.

현재 접근법은 엔터티를 상속받은 웹 서비스 구현 프로젝트에 두 개의 클래스 (RequestInput, RequestOutput)를 생성하는 것입니다. 그런 다음 필요한 다양한 속성에 [DataMember] 특성을 추가하고 무시해야하는 특성에는 [IgnoreDataMember] 특성을 추가합니다.

올바른 방법입니까?

답변

1

나는 그것이 옳거나 틀린 방식이라고 말하지 않을 것입니다. 그러나 요청 및 응답이 이상적으로 클라이언트와 서버에서 사용중인 모델의 표현에서 분리되어야한다

[DataContract] 
Request{...} 

[DataContract] 
Response{...} 

의 라인을 따라 이름이 뭔가를 사용하는 것이 더 일반적이다 - 즉, 서비스 코드에서 해당 모델을 모델에 매핑하는 정면 또는 어댑터가 있습니다.

이것은 내가 어떻게 할 것인가의 라인을 따르고 있습니다 -하지만 이것은 엔티티 등의 크기에 매우 의존적입니다 - 어떻게 든 자동 매핑을 필요로 할 수 있습니다.

// higher level code 
var entity = new Entity { properties we know before call }; 
// pass down to service layer 
var response = service.CreateRequest(new Request { Prop1 = entity.Prop1... }); 
entity.RequestID = response.RequestId; 
entity.CreatedDate = response.CreatedDate; 
+0

웹 서비스 요청 객체의 모델 요청 객체에 대한 추가 매핑이 코드 중복을 가져 오는 것으로 보입니다. –