2009-03-18 3 views
5

두 가지 개체가 있습니다. 하나는 엔터프라이즈 수준이고 다른 하나는 서비스 수준입니다. 서비스 개체는 엔터프라이즈에서 상속됩니다. 여기에 빠른 예입니다개체 상속을 사용하는 WCF 직렬화?

[DataContract] 
public class EnterpriseObject{ 
    [DataMember] 
    int ID{get; set;} 

    string InternalUse{get; set;} 
} 

[DataContract] 
public class ServiceObject: EnterpriseBaseObject{ 
    [DataMember]  
    string Address{get; set;} 
} 

그것을 할 수는 직렬화에서 (EnterpriseObject에서 상속 된 속성 사용) ServiceObject 노출? 클라이언트가 옵션으로 나열된 엔터프라이즈 개체를 보는 것을 원하지 않습니까? 이 예제에서 볼 수 있듯이 DataMember 특성은 InternalUser 속성에 대해 설정되지 않습니다. 그게 유일한 방법인가요? 감사합니다

답변

7

EnterpriseBaseObject[KnownType(typeof(ServiceObject))]을 추가하여 상속을 처리합니다. 그러나 EnterpriseBaseObject은 여전히 ​​계약의 일부이며 그 존재 성은 공개됩니다. 단 [DataMember]으로 표시된 회원 만 게시됩니다.

하나의 옵션 (상속을 제거하기 위해)은 직렬화를 위해 별도의 DTO를 가지며 DTO 버전과 실제 버전 사이의 변환이 있지만 추가 작업이 필요합니다.

+0

많은 도움이되었습니다. – Slavo

2

Is A 패턴에서 Has A 패턴으로 변경할 수 있습니까? ServiceObject에 EnterpriseObject가있는 경우 필요한 속성 만 표시 할 수 있습니다.

당신이 (A DataMember를로 표시되는) 모든 속성을 포함하여 고객에게 ServiceObject를 노출 할 제대로 이해하고 편집

포함 속성은 EnterpriseObject로부터 상속. 그러나 당신은 클라이언트가 EnterpriseObject라는 객체가 있음을 알리고 싶지 않습니다.

엔터프라이즈 개체가 있다는 사실을 숨겨서이 작업을 수행 할 수 있습니다. 상속 패턴 인 "Is A"관계를 사용하는 대신. 컴포지션 또는 "A 있음"패턴을 사용할 수 있습니다.

public class ServiceObject 
{ 
    private EnterpriseObject _myEntObject; 

    public string MyServiceObjectProperty 
    { 
     get; 
     set; 
    } 

    public string MyEntObjectProperty 
    { 
    get { return _myEntObject.MyEntObjectProperty;} 
    } 
} 

이제 클라이언트에서 EnterpriseObject를 분리했습니다. ServiceObject에는 다른 객체에 의해 서버에 구현 된 클라이언트에 공개되지 않는 일부 속성이 있습니다.

이것은 또한 데이터를 전송하는 유일한 목적의 객체 인 DTO를 갖는 것과 유사합니다. DTO를 사용하면 내부 객체를 노출시키지 않고 클라이언트가 필요한 형식을 원하는 형식으로 정확하게 제공하여 구현을 숨길 수 있습니다.

+0

여기에 무슨 뜻인지 확실하지 않습니다. 설명해 주시겠습니까? – DDiVita

+0

당신이 말하는 것을 봅니다. 그것은 흥미로운 접근입니다! 감사! – DDiVita