2009-09-25 3 views
0

나는이 질문이 here 전에 물어 보았지만 여전히 무엇을 선택해야할지 모르겠다.외부 시스템에 서비스 공개 - 계약을 어떻게 디자인해야합니까?

내 서비스는 엔터프라이즈의 많은 3 자 시스템에서 호출됩니다. 서비스가 수집 할 정보 (MyBigClassWithAllInfo)는 제품 수명 기간 동안 변경 될 것입니다. 객체를 노출하는 것이 여전히 좋은 생각입니까?

이 기본적으로 무엇을 내 두 가지 대안이다 :

[ServiceContract] 
public interface ICollectStuffService 
{ 
    [OperationContract] 
    SetDataResponseMsg SetData(SetDataRequestMsg dataRequestMsg); 
} 

// Alternative 1: Put all data inside a xml file 
[DataContract] 
public class SetDataRequestMsg 
{ 
    [DataMember] 
    public string Body { get; set; } 
    [DataMember] 
    public string OtherPropertiesThatMightBeHandy { get; set; } // ?? 
} 
// Alternative 2: Expose the objects 
[DataContract] 
public class SetDataRequestMsg 
{ 
    [DataMember] 
    public Header Header { get; set; } 
    [DataMember] 
    public MyBigClassWithAllInfo ExposedObject { get; set; } 
} 

public class SetDataResponseMsg 
{ 
    [DataMember] 
    public ServiceError Error { get; set; } 
} 

XML 파일은 다음과 같이 보일 것이다 :

< XML 버전 = " 1.0 " 인코딩 = " UTF-8 "? > < 메시지 >   < 헤더 >     <InfoAboutTheSender> ... </InfoAboutTheSender >   </헤더 >   <StuffToCollectWithAllTheInfo>   <stuff1> ... </stuff1 > </StuffToCollec tWithAllTheInfo > </메시지 >


이 서비스를 구현하는 방법에 대한 어떤 생각?

감사 Larsi

단순히 함께 전송 될 수있는 변형 유형 목록을 가지고 메시지를 작성할 것까지 뭔가를 얻을 수있는 정보가 수명 동안 바꿀 것입니다하지만 당신은 총 미만인 경우

답변

0

메시지 유형 버전 번호 .. 버스는 버전 번호를보고 적절하게 경로를 지정할 수 있습니다. 이전 버전의 메시지가 붙어있는 고객은 사용중인 메시지 인터페이스를 변경할 필요가 없습니다.

+0

글쎄, 당신은 정확한 (절대에 대한) absoulutt있어. 나는 당신이 왜 변형 유형에 의한 것인지 잘 모르겠다. 일부 일반 field1, field2, field3을 messagetype 필드와 함께 사용할 것을 제안합니까? 현재 내 서비스는 약 30 개의 필드를 수집하며 성장할 것으로 예상됩니다. – Larsi

+0

예. 따라서 여러분이 세상에 드러내는 것은 해시 맵과 비슷한 것입니다. 그런 다음 일단 열린 XML 구조체를 마샬링하면 전달되는 메시지 버전을 기반으로 필드, 유형 등을 확인할 수 있습니다. –

+0

또한 http : // www에서 Udi Dahan의 서비스 및 계약 버전에 대한 게시물을 확인하십시오. .udidahan.com/2009/04/10/backwards-compatibility-versioning-problems-arenrsquot / – lasseeskildsen

관련 문제