2009-06-21 2 views
1

서버에서받은 datacontract 객체를 가져 와서 조작하고 조작 된 버전을 반환하지만 작동하지 않는 것 같습니다. KnownType 또는 ServiceKnownType 특성을 사용하여 작동하도록 할 수는 있지만 모든 데이터를 왕복 전송하지는 않습니다.WCF DataContract Upcasting

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

[DataContract] 
public class MyDerivedObject : MyBaseObject 
{ 
    [DataMember] 
    public string Name { get; set; } 
} 


[ServiceContract(Namespace = "http://My.Web.Service")] 
public interface IServiceProvider 
{ 
    [OperationContract] 
    List<MyBaseObject> SaveMyObjects(List<MyDerivedObject> myDerivedObjects); 
} 

public class ServiceProvider : IServiceProvider 
{ 
    public List<MyBaseObject> SaveMyObjects(List<MyDerivedObject> myDerivedObjects) 
    { 
     ... do some work ... 

     myDerivedObjects[0].Id = 123; 
     myDerivedObjects[1].Id = 456; 
     myDerivedObjects[2].Id = 789; 

     ... do some work ... 

     return myDerivedObjects.Cast<MyBaseObject>().ToList(); 
    } 
} 

누구는 어떻게 새로운 개체를 다시 만들 필요하거나 KnownType 속성을 사용하지 않고 작동하도록하는 아이디어가 : 아래의 예는?

답변

0

귀하의 문제는 귀하가 일반 목록을 보내려고한다는 것입니다.

개체를 목록에 캡슐화하면 작동합니다. 즉, 일반 목록 인 단일 공용 속성을 가진 개체를 만듭니다.

또한 계약에서 직접 사용되지 않는 모든 클래스가 직렬화 가능으로 표시되어 있는지 확인해야합니다.

+0

IList가 정상적으로 보냅니다. 그것은 작동하지 않는 객체를 업 캐스트하려고 할 때입니다. 나는 모든 데이터를 왕복 여행하고 싶지 않다. –

+0

사용자 지정 매핑 코드 또는 인터페이스를 사용해 볼 수 있습니다. –

0

파생 된 개체를 반환하려는 경우 클라이언트와 서비스가 별도이므로 왕복이 항상 발생합니다. 클라이언트가 자체 MyBaseObject 목록을 업데이트하려면 서버에서 제공된 MyDerivedObject 목록을 비 직렬화해야합니다.

KnownType 및/또는 ServiceKnownType의 사용이 필요합니다.이 유형 정보를 WSDL에 추가하면 클라이언트가 올바른 형식으로 메시지를 deserialize하는 데 사용됩니다. 우선 들어

, 당신이 설명한 시나리오 테스트하기위한 유용한 도구 : http://www.wcfstorm.com

+0

깔끔한 유틸리티! :) 나는 그것을 시도해야합니다. 업 캐스팅과 관련하여 기본 객체를 인스턴스화하고 값을 설정하면 추가 작업을 피하고 파생 된 객체를 업 캐스팅하고 싶습니다. 그것의 외관에서 이것은 불가능합니다. –

0

당신은 DataContractSurrogate (IDataContractSurrogate)를 만들어보십시오 수 및 GetDataContractType에 대한 호출에 대한 귀하의 기본 유형을 반환. 나는 그것이 그것이 "여분의 일"에서 더 나을지도 모르지만 그것이 사용되도록 의도 된 방법인지는 모르겠지만, 아마도 그 여분의 일의 범위를 이해하지 못할 수도 있습니다.

0

WCF (및 .net remoting)의 문제점 중 하나는 메서드 호출과 같이 "메시지 전달"을 시도하는 것입니다.

너무 많은 "oop"유형 디자인을 사용하려고 시도하면 떨어집니다.

메시지가 .NET 클래스로 표현 있다는 사실은, 하지 는 .NET 클래스와 같은 자신의 행동의 모든을 수행합니다.

누출 추상화 문제에 대한 자세한 내용은 thisthis을 참조하십시오.

그래서 WCF 인터페이스를 디자인 할 때 객체가 아닌 메시지 전달에 대해 생각해 봐야합니다. 그렇지 않으면 이런 문제가 많이 발생할 것입니다.

관련 문제