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)] может помочь.