我使用DTO错了我的服务吗?

时间:2011-11-30 17:13:25

标签: wcf web-services dto

我目前有一个公开SOAP enpoint的WCF服务。在这个网络服务中,我有以下方法:

    public List<DataField> GetAvailableFields(string accountNumber, string accountKey, Models.Enums.CountryEnum country)
    {
        //Code that builds DataFields
        return 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; }
}

所以我有2个问题。

1:ParentField引用...我猜这需要,因为我不确定如何序列化

2:有我的替代字段列表是否合适?这本质上是DTO内部的DTO列表,但似乎这应该序列化很好,并且应该没有与此互操作性问题。一般而言......在其他DTO中使用DTO是不好的做法吗?

谢谢你,并随时指出我做错了什么。

2 个答案:

答案 0 :(得分:2)

如果需要整个数据集,那么在DTO中使用DTO是完全合法的。否则,请考虑仅为您的域实体发送足够的信息(例如,引用实体的ID)。

FYI父字段应序列化正常(只要没有循环引用)。

答案 1 :(得分:0)

1)父字段上没有DataMember装饰器,因此它不会首先序列化。

假设它 上有装饰器,你仍然可以正常序列化(因为DataField是一个数据契约)。但是,你需要注意不要使用它进入循环并开始在无限时间内发送所有内容(这是获得异常的好方法)。

2)DTO清单没问题。但是,您需要确保不要发送重复数据。只需发送您需要的数据,然后在另一端处理它。

通常,我发送一个DTO列表,所有DTO都有唯一的ID,并且它们都有Int32的列表指向那些唯一的ID。但是,如果仅为此目的发送,那么这很好。