WCF: вернуть только необходимые свойства на json

Из-за настройки производительности я хотел бы вернуть только необходимые свойства. Есть ли возможность / обходной путь? Псевдо / пример кода для понимания:

[DataContract]
public interface IMemberOverview
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string Name { get; set; }
}

[DataContract]
public interface IMemberDetail
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Status { get; set; }

    [DataMember]
    public string Infos { get; set; }
}

public class Member : IMemberOverview, IMemberDetail
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string Status { get; set; }

    public string Infos { get; set; }
}

и сервис:

[OperationContract]
[WebInvoke(
    Method = "GET",
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json,
    UriTemplate = "ListMembers")]
[KnownType(typeof(Member))]
public List<IMemberOverview> ListMembers()
{
    return MemberDAO.Instance().GetAll();
}

[OperationContract]
[WebInvoke(
    Method = "GET",
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json,
    UriTemplate = "Member/{idString}")]
[KnownType(typeof(Member))]
public List<IMemberDetail> Member(string idString)
{
    var id = int.Parse(idString);
    return MemberDAO.Instance().Get(id);
}

2 ответа

Решение

Если вы хотите представить другое представление вашей объектной модели, то самый простой подход - это просто представить данные в более тонком DTO - т.е. написать второй класс (обычно в другом пространстве имен) и перевести данные между ними. Либо вручную (напишите некоторый код, возможно, оператор статического преобразования, который делает это), либо с помощью таких утилит, как PropertyCopy ( вроде так).

Наличие отдельного DTO также позволяет расширить базовую объектную модель, не влияя на производительность клиента, и значительно упрощает управление версиями.

Если я правильно понимаю ваш вопрос, [DataMember(EmitDefaultValue=false)] может помочь.

Другие вопросы по тегам