2011-11-30 3 views
1

현재 SOAP enpoint를 노출하는 WCF 서비스가 있습니다. 이 웹 서비스에서 나는 다음과 같은 metthod 있습니다내 서비스에 DTO를 잘못 사용하고 있습니까?

public List<DataField> GetAvailableFields(string accountNumber, string accountKey, Models.Enums.CountryEnum country) 
    { 
     //Code that builds DataFields 
     return dataFields; 
    } 

내 Datafields이

 [DataContract] 
public class DataField 
{ 
    public DataField() 
    { 
     AlternativeFields = new List<DataField>(); 
    } 
    [DataMember] 
    public string FieldName { get; set; } 
    [DataMember] 
    public string Value { get; set; } 
    [DataMember] 
    public bool IsRequired { get; set; } 
    [DataMember] 
    public List<DataField> AlternativeFields { get; set; } 
    public DataField ParentField { get; set; } 
} 

같은 것을 보일 수를 그래서 나는이 개 질문이 있습니다.

1 : ParentField 참조가 ...이 내가 그

2를 직렬화 얼마나 잘 모르겠어요으로 갈 필요가 있다고 추측하고있다 : 그것은 다른 분야의 내 목록을 가지고 적절한가요? 이것은 본질적으로 DTO 내부의 DTO 목록입니다. 그러나 이것은 직렬화가 잘되어야하며 상호 운용성 문제가 없어야합니다. 일반적으로 DTO를 다른 DTO 안에 포함시키는 것은 나쁜 습관입니까?

내가 잘못하고있는 것을 지적 해 주셔서 감사합니다.

답변

0

1) 부모 필드에는 DataMember 데코레이터가 없으므로 처음에는 직렬화되지 않습니다.

그것은 가에 장식을했다는 것을 가정하면, 당신은 여전히 ​​괜찮을 것과 (을 DataField는 데이터 계약이기 때문에) 제대로 직렬화 것이다. 그러나 이것으로 루프에 들어 가지 않도록하고 무한 시간 동안 모든 것을 전송하기 시작해야합니다 (예외를 얻는 좋은 방법입니다).

2) DTO 목록이 좋습니다. 그러나 다시 한 번, 중복 데이터를 보내지 않도록해야합니다. 필요한 데이터를 보내고 다른 쪽에서 처리하십시오.

일반적으로 모든 DTO 목록을 고유 ID로 보내고 모두 고유 ID를 가리키는 Int32 목록이 있습니다. 그러나,이 목적을 위해서만 전송되는 경우, 이것은 괜찮습니다.

2

전체 데이터 세트가 필요할 경우 DTO 내에 DTO가있는 것이 합법적입니다. 그렇지 않으면 완전히 채워지는 도메인 엔터티 (예 : 참조 된 엔터티의 ID)에 대한 충분한 정보 만 보내는 것을 고려하십시오.

FYI 상위 필드는 순환 참조가없는 한 정상적으로 직렬화해야합니다.

관련 문제