2009-04-06 5 views
1

상속을 사용하는 일부 개체 클래스가 있습니다. 그것은 서비스에 의해 직접적으로 사용되는 객체에만 접근 할 수있는 것 같습니다. 제가 달성하기 위해 노력하고 무엇을 보여주지 :WCF 서비스에서 직접 사용할 수없는 개체 (DataContracts)를 표시 하시겠습니까?

[DataContract] 
public class Object1 
{ 
    [DataMember] 
    int Id {get; set;} 
} 

[DataContract] 
public class object2: Object1 
{ 
    [DataMember] 
    string Name {get; set;} 
} 

[DataContract] 
public class object3 
{ 
    [DataMember] 
    int SomeNumber {get; set;} 
} 

본 서비스 :

public int GetId(object2 obj) 
{ 
    return GetTheId(object2.Name); 
} 

을 지금은 서비스에 object2 사용하고 있기 때문에, 오브젝트 1도 직렬화됩니다. Howerver, object3을 어떤 이유로 노출 시키길 원할 수도 있습니다. 그것은 전달해야만하는 파생 클래스가 될 수 있으므로 나중에 다른 프로세스에서 해당 유형을 확인할 수 있습니다. 나는이 객체가 직렬화되는 것을 보지 못했다. 나는 당신이 DataContract/DataMember를 설정할 때마다 그 객체들이 직렬화 될 것이라고 생각했다. 필요하지 않은 항목을 노출하는 문제가 발생할 수 있기 때문에 사용하지 않은 것을 노출하지 않는 것이 좋습니다. 서비스에서 직접 사용하지 않는 객체를 표시하는 가장 좋은 방법은 무엇입니까? 감사합니다

다니엘

답변

1

당신은 KnownType attribute로 (클래스 : 대한 고유 이름) object2 장식한다 :

[DataContract] 
[KnownType(typeof(object3))] 
public class object2 
{ 
} 

를 가정하면, 오브젝트 4가 object2의 서브 클래스 의미 : 정확히

public class object3: object2 
{ 
} 
+0

그 속성에 대해 완전히 잊어 버렸습니다 !!! 감사. 그것이 내가 htis 상황에서 필요한 것입니다. 감사!!!!! – DDiVita

+1

[ServiceKnownType]을 사용하여 서비스 계약을 장식 할 수도 있습니다. :) –

-1

나는 당신이 당신의 자신의 질문에 대답했다고 믿습니다. 회원이 서비스에서 사용하지 않으면 노출되지 않아야합니다. 일반적으로 서비스의 유지 관리 가능성이 높아 지므로 서비스에서 요구하는 최소한의 데이터 집합 만 노출하는 것이 좋습니다.

+0

,하지만이입니다 직접적으로 사용되지 않는 객체를 노출시키는 가장 좋은 방법은 무엇입니까? – DDiVita

+0

하지 않는 것이 가장 좋은 방법입니다. 클라이언트가 알아야 할 서버의 유일한 것은 서비스 조작에 의해 사용되는 오브젝트입니다. –

+0

이 상황에서는 상속이 현실이라는 사실을 무시합니다. 이는 코드로 설계된 계약과 XML 스키마로 설계된 계약 모두에 대한 현실입니다. 클라이언트가 해당 유형에 대한 정의를 가질 수 있도록 "상속 된"유형을 정의해야합니다. –

관련 문제